2012-03-19 51 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()