【问题标题】:Format of a stored procedure存储过程的格式
【发布时间】:2012-03-19 09:22:05
【问题描述】:

我在 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(数据集)但我也没有得到这个概念在线。

【问题讨论】:

  • 我可以做所有的 IF/else 语句代码,只是不知道如何通过存储过程获取数据以及将其存储在何处以及如何检索它。干杯

标签: c# sql .net stored-procedures


【解决方案1】:

你可以像这样使用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();

您可以使用 DataTable 的索引器从 DataTable 中检索值。喜欢,

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
}

【讨论】:

  • 我将如何将 If 语句与此 DataTable 一起使用?,干杯
【解决方案2】:

您可以使用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
        }
    }
}

【讨论】:

    【解决方案3】:

    有几种方法可以从存储的过程中取回数据我已经包含了 3 种不同的方法,使用 Knvn 的 Reader 的示例也很好,我只是没有在这里包含它,因为不需要复制他的回答。

    我知道这些是在 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
    

    如果您有一个只返回一个结果的过程,您可能希望将其作为标量执行并将结果分配给一个变量,如下所示:

      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()
    

    【讨论】:

      猜你喜欢
      • 2014-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      相关资源
      最近更新 更多