存储过程的格式

本文关键字:格式 存储过程 | 更新日期: 2023-09-27 18:28:25

我在谷歌上搜索了很多,但找不到一种格式,可以连接到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(数据集),但我也没有在网上了解这一概念。

存储过程的格式

您可以像这样使用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的索引器从中检索值。比如

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
}

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

有几种方法可以从存储的procs中获取数据。我已经包括了三种不同的方法,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

如果您有一个只返回一个结果的过程,您可能希望将其作为标量执行,并将结果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()