sqlConnection a = new sqlConection(...);
sqlCommand b = new sqlCommand("EXEC storedProcedure()", a);
sqlDataAdapter c = new sqlDataAdapter(b);
DataTable d = new DataTable();
c.Fill(d);
因此,当存储过程进行插入时,行已成功添加,但代码会抛出异常。
我知道存在专门用于存储过程的sqlCommand.CommandType,但我的架构需要以这种方式制作。
答案 0 :(得分:0)
设置适配器" SelectCommand"财产改为
var cmd = new SqlCommand("EXEC storedProcedure()", a);
cmd.CommandType = CommandType.StoredProcedure; //set command property
//..
var adapter = new SqlDataAdapter();
adapter.SelectCommand = cmd; //set adapter command for select query
并且您的命令类型必须为CommandType.StoredProcedure
才能执行SP,您的架构不需要这个吗?只是问他有充分的理由。
答案 1 :(得分:0)
您的SQL语法已关闭。
来自http://technet.microsoft.com/en-us/library/ms188332.aspx:
USE AdventureWorks2012;
GO
DECLARE @CheckDate datetime;
SET @CheckDate = GETDATE();
EXEC dbo.uspGetWhereUsedProductID 819, @CheckDate;
GO
所以你的代码应该是:
new sqlCommand("EXEC storedProcedure", a);
答案 2 :(得分:0)
虽然有很多方法可以做同样的事情,但有些事情在你按框架建议的方式进行时效果最好。
在这种情况下,运行存储过程时可能会发生一些事情,具体取决于它是哪个过程。它可能返回一组行,或几组行,或者根本不返回任何行。已经有了我们可以做的事情来处理所有这些情况,由.NET框架提供。
以下是我过去用于返回一个或多个行集的任何SP的扩展程序代码:
public static DataSet ExecuteStoredProcedure(this SqlConnection connection, string SPName, params object[] parameters)
{
using (var cmd = connection.CreateCommand())
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = SPName;
cmd.CommandTimeout = 60;
if (connection.State != ConnectionState.Open)
connection.Open();
SqlCommandBuilder.DeriveParameters(cmd);
int index = 1;
foreach (object p in parameters)
{
if (index >= cmd.Parameters.Count)
break;
cmd.Parameters[index++].Value = (p == null ? DBNull.Value : p);
}
using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
{
DataSet res = new DataSet();
adapter.Fill(res);
return res;
}
}
}
处理非行集返回值和输出参数需要更多工作,但这可以满足您的直接需求:
var conn = new SqlConnection("some connection string");
DataSet ds = conn.ExecuteStoredProcedure("storedProcedure");
DataTable d = ds == null ? null : ds.Tables.Length < 1 ? null : ds.Tables[0];