我在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 :(得分:2)
您可以使用ExecuteReader()
这样的SqlCommand
方法:
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
}
答案 1 :(得分:1)
有几种方法可以从存储过程中获取数据我已经包含了3种不同的方法来实现它,使用Reader by 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()
答案 2 :(得分:1)
您可以使用ExecuteReader
来检索阅读器。阅读器迭代结果集中的所有行。要检索第一行,请拨打Read()
一次。
如果Read()
返回true,则可以访问read["column1"]
之类的列。列的类型可以是SqlTypes.SqlInt32
,您可以使用int
转换为as
。
所以你最终得到的结果是:
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
}
}
}