存储过程的格式
本文关键字:格式 存储过程 | 更新日期: 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(数据集),但我也没有在网上了解这一概念。
您可以像这样使用SqlCommand
的ExecuteReader()
方法:
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()