在最后一部分我讨论了工作解决方案: 我在SQL Server中有这个存储过程:
alter PROCEDURE [dbo].[ProcedureName]
@v nvarchar(10),
@L NVarChar(2)
AS
BEGIN
SET NOCOUNT ON;
SELECT B,M,V
FROM XXXX
WHERE V = @v and L = @L
END
我正在传递参数,但我无法检索SELECT
部分,我需要检索Select B,M,V
的B,M,V
SqlCommand Cmd = new SqlCommand("ProcedureName", cnn);
Cmd.CommandType = CommandType.StoredProcedure;
Cmd.Parameters.Add("@v", SqlDbType.NVarChar, 10).Value = v;
Cmd.Parameters.Add("@L", SqlDbType.NVarChar, 2).Value = lo;
if (Cmd.Connection.State == ConnectionState.Closed)
{
Cmd.Connection.Open();
}
Cmd.ExecuteNonQuery();
这是我在这里给予帮助的解决方案:
SqlCommand Cmd = new SqlCommand("ProcedureName", cnn);
Cmd.CommandType = CommandType.StoredProcedure;
Cmd.Parameters.Add("@v", SqlDbType.NVarChar, 10).Value = v;
Cmd.Parameters.Add("@L", SqlDbType.NVarChar, 2).Value = lo;
if (Cmd.Connection.State == ConnectionState.Closed)
{
Cmd.Connection.Open();
}
using (SqlDataReader reader = Cmd.ExecuteReader())
{
if (reader.HasRows)
{
while (reader.Read())
{
ret = new MYCLASS();
ret.B = reader.GetString(0);
ret.M = reader.GetString(1);
ret.V = reader.GetString(2);
}
}
}
答案 0 :(得分:5)
您需要使用 SqlDataReader 来实现这一目标。还可以使用using
块来确保连接对象已正确关闭和处理。
来自 MSDN
要确保始终关闭连接,请打开using块内部的连接,如以下代码片段所示。这样做可确保在代码退出块时自动关闭连接。
您可以将代码更改为:
using(var con = new SqlConnection("ConnectionString")) {
using(var cmd = new SqlCommand("ProcedureName", con)) {
//Params here
con.Open();
using(var reader = cmd.ExecuteReader()) {
while (reader.Read()) {
var bValue = reader.GetString(0);
//Same for the next two values
}
}
}
}
答案 1 :(得分:1)
你几乎就在那里,现在如果你密切注意你的代码,你没有使用正确的方法来处理你的程序。这可以通过以下方式轻松实现:
ExecuteReader
因为您只是从数据库中读取。
而不是:
ExecuteNonQuery
通常用于UPDATE
,INSERT
或DELETE
语句