在我的数据库中,我有三个模式:
根据对象的功能将对象分离到每个模式中,我认为这是一种很好的做事方式。这反过来在dbo
中不会留下任何对象,除了我未修改的model
数据库中的默认对象。
当我尝试从代码引用存储过程时,在指定存储过程时,我收到Stored Procedure Not Found
错误。当我将CommandType
更改回文本时,代码会起作用。
我没有代码,但它看起来像这样(写在我的头顶,所以不要指望它编译):
using(DbConnection conn as new DbConnection("Conn String")
{
using(DbCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "Schema1.usp_Category_MySproc @param1,@param2";
cmd.CommandType = CommandType.StoredProcedure;
conn.Open();
DbDataReader rdr = cmd.ExecuteQuery();
while(rdr.Read())
{
// DO STUFF
}
}
}
我还注意到参数必须按顺序传递,否则它们都被交换(因为我只能使用CommandType.Normal
我没有使用其他命令类型测试参数)。我猜测参数传递的顺序无关紧要,只要传入每个参数?
有什么想法吗?
与往常一样,c#或vb中的答案都可以接受。
备注:
答案 0 :(得分:10)
根据documentation,它正在寻找名为"Schema1.usp_Category_MySproc @param1,@param2"
的存储过程,当然,它不存在。
将CommandType设置为StoredProcedure时,应将CommandText属性设置为存储过程的名称。
我能够使用以下代码为命令添加参数:
cmd.CommandText = "Schema1.usp_Test";
cmd.CommandType = CommandType.StoredProcedure;
var parameter = cmd.CreateParameter();
parameter.ParameterName = "@value";
parameter.DbType = DbType.Int32;
parameter.Value = 100;
cmd.Parameters.Add(parameter);
答案 1 :(得分:4)
我认为您正在尝试执行数据库中已存在的命令? 如果是这样,最好还是使用以下格式添加StoredProc并使用它来添加参数...
string sqlCommand = "schema1.StoredProcName";
DbCommand dbCommand = db.GetStoredProcCommand(sqlCommand);
db.AddInParameter(dbCommand, "@Param1", DbType.Int32, 1);
db.AddInParameter(dbCommand, "@Param2", DbType.Int32, 2);
db.ExecuteNonQuery(dbCommand);
查看处理参数:http://msdn.microsoft.com/en-us/library/ff649451.aspx
答案 2 :(得分:3)
如果您使用的是StoredProcedure命令类型,则不应在命令文本中指定参数名称。看起来应该更像这样:
cmd.CommandText = "Schema1.usp_Category_MySproc";