2012-03-19 50 views
0

我在Google上搜索了很多,但是我找不到格式,之后我可以建立与SQL Server的连接,并从存储过程获取数据,该存储过程不需要任何参数,来自两个表的数据。存储过程的格式

我想要的是从存储过程中获取数据并存储在可以轻松检索数据的东西中。

我的存储过程,

ALTER PROCEDURE [dbo].[GetTablesData] 
AS 
    SELECT TableA.Column1, TableB.Column2 
    FROM TableA TableA 
    INNER JOIN TableB TableB 
    ON TableA.ID = TableB.ID AND TableA.ID2 = TableB .ID2 

正如我将得到两列,我需要检查

If (Column1 < 7) 
    Then Get Column2 and calculate a email address (by stripping off things from that column and get the data I want...) and send an email. 

现在我不知道我怎么会调用存储过程和使用做它在IF else语句中,我看着旧代码,他们在哪里使用XSD(数据集),但我没有得到在线的概念。

+0

我可以做所有的if/else语句代码只是不知道如何通过存储过程得到的数据和在哪里存储它,以及如何检索。欢呼 – 2012-03-19 09:26:08

+0

相关:http://stackoverflow.com/questions/1260952/how-to-execute-a-stored-procedure-from-c-sharp-program – 2012-03-19 09:27:01

回答

1

您可以使用ExecuteReader检索读者。阅读器迭代结果集中的所有行。要检索第一行,请拨打Read()一次。

如果Read()返回true,则可以访问像read["column1"]这样的列。列的类型可以是SqlTypes.SqlInt32,您可以使用as将其转换为int

所以你最终的东西,如:

using (var con = new SqlConnection("...connection string here...")) 
{ 
    var com = con.CreateCommand(); 
    com.CommandText = "GetTablesData"; 
    com.CommandType = CommandType.StoredProcedure; 
    con.Open(): 
    using (var read = cmd.ExecuteReader()) 
    { 
     if (!read.Read()) 
      throw new Exception("No rows returned!")l 

     if (read["Column1"] as int < 7) 
     { 
      var col2 = read["Column2"] as string; 
      // Do stuff with col2 
     } 
    } 
} 
2

您可以使用SqlCommandExecuteReader()方法是这样的:

SqlConnection sqlConnection1 = new SqlConnection("Your Connection String"); 
SqlCommand cmd = new SqlCommand(); 
SqlDataReader reader; 

cmd.CommandText = "GetTablesData"; //StoredProcedureName 
cmd.CommandType = CommandType.StoredProcedure; 
cmd.Connection = sqlConnection1; 

sqlConnection1.Open(); 

reader = cmd.ExecuteReader(); 

DataTable myData = new DataTable(); 
myData.Load(reader); 

sqlConnection1.Close(); 

您可以使用它的索引检索数据表中的值。像,

foreach(var dr in myData) 
{ 
    Debug.WriteLine("By Column Name:" + dr["ColumnName"]); 
    Debug.WriteLine("By Column Index:" + dr[0]); 
    Debug.WriteLine("------Next Row-------"); 
} 

更具体地说...

if(Convert.ToInt32(dr["Column1"]) < 7) 
{ 
    //Do required operation 
} 
+0

如何我将能够使用如此声明与此DataTable呢? ,欢呼声 – 2012-03-19 09:42:45

+0

抱歉,我已经更新了答案。 – NaveenBhat 2012-03-19 12:00:21

1

有几个方法,你可以拿回从我已经包含了3点不同的方式来做到这一点,利用阅读器通过Knvn的例子中存储的特效数据也不错,我只是没有把它包括在内,因为没有必要重复他的答案。

我知道这些是在VB中,你正在使用C#,但他们很容易转换和工作方式很相似。

这会将您的数据放回到数据表中。

Dim dt As New DataTable 

    Dim conn As New SqlConnection(ConfigurationManager.ConnectionStrings("Blueprint").ToString()) 

    Dim cmd As New SqlCommand 
    cmd.CommandType = CommandType.StoredProcedure 
    cmd.CommandText = "spNameHere" 

    cmd.Connection = conn 

    Using da As New SqlDataAdapter(cmd) 
    conn.Open() 
    da.Fill(dt) 
    conn.Close() 
    End Using 

如果您有仅会返回一个结果的过程中,您可能要执行它作为一个标量,并将结果streight分配给像这样的变量:

Dim names As String = String.Empty 

    Dim ds As New DataTable 

    Dim conn As New SqlConnection(ConfigurationManager.ConnectionStrings("Blueprint").ToString()) 

    Dim cmd As New SqlCommand 
    cmd.CommandType = CommandType.StoredProcedure 
    cmd.CommandText = "spNameHere" 

    cmd.Connection = conn 

    conn.Open() 

    names = cmd.ExecuteScalar() 

    conn.Close() 

然后第三个例子如果你想执行一些不返回任何内容的SQL。在这种情况下,没有必要使用读卡器等你可以做的ExecuteNonQuery()

Dim conn As New SqlConnection(ConfigurationManager.ConnectionStrings("Blueprint").ToString()) 

    Dim cmd As New SqlCommand 

    cmd.CommandType = CommandType.StoredProcedure 
    cmd.CommandText = "spNameHere" 

    cmd.Connection = conn 

    conn.Open() 
    cmd.ExecuteNonQuery() 
    conn.Close()