请教:关于C#中的调用存储过程问题 string sSqlStr="InsertAllData @sMod,@sNum,@dNumDate,@iN1,@iN2,@iN3,@iN4,@iN5,@iN6,@iN7,@iN8,@iN9";--->string sSqlStr="InsertAllData"; 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 应该是EXECUTE InsertAllData @sMod,@sNum,@dNumDate,@iN1,@iN2,@iN3,@iN4,@iN5,@iN6,@iN7,@iN8,@iN9"; to wangxiaohu(如花) 51106354(大头)已经试过,依然抱错看过MSDN的例子,他们的例子:OleDbCommand2.CommandText = "NewAuthor";OleDbCommand2.CommandType = CommandType.StoredProcedure;// Set parameter values. In this case, all parameter values// are strings.OleDbCommand2.Parameters["au_id"].Value = TextBox1.Text;OleDbCommand2.Parameters["au_lname"].Value = TextBox2.Text;OleDbCommand2.Parameters["au_fname"].Value = TextBox3.Text;............OleDbConnection2.Open();try{ cmdresults = OleDbCommand2.ExecuteNonQuery();}catch (Exception ex){ MessageBox.Show("Failed to execute command");}OleDbConnection2.Close();我的是用Parm,但是我使用CommandType.Text(这个是默认)就可以阿?怎么回事? 例子地址:ms-help://MS.MSDNQTR.2003FEB.2052/vbcon/html/vbtskExecutingUpdatesOrDatabaseCommandsUsingDataCommand.htm SqSqlCommand myCommand= new SqlCommand(sSqlStr,myConnection);myCommand.CommandType=CommandType.StoredProcedure;SalParameter param;param=myCommand.Parameters.Add(("@sMod",SqlDbType.NVarChar,50);param.Value=bo.Mod;...... to fengqingyang1979(风轻扬)依然不行!在线等 SqSqlCommand myCommand= new SqlCommand("InsertAllData",myConnection);myCommand.CommandType=CommandType.StoredProcedure;myCommand.Parameters.Add("@sMod",SqlDbType.NVarChar,50).Value=bo.Mod;使用存储过程只用名字就可以。然后把必要的参数添加进去就可以。你的那个方法是个查询语句里面调用存储过程,所以要用myCommand.CommandType=CommandType.Text这样不能把存储过程的优势发挥到极致。 to fengyuyan(风雨岩)我也试过,依然如此 试试string sSqlStr=@"InsertAllData @sMod,@sNum,@dNumDate,@iN1,@iN2,@iN3,@iN4,@iN5,@iN6,@iN7,@iN8,@iN9"; 调用存储过程的标准方法:SqlCommand cmd=new ("sp.存储过程名称",myconnection);cmd.CommandType=CommandType.StoredProcedure;cmd.Parameters.Add("参数名",SqlDbType.数据类型,数据长度);cmd.Parameters["参数名"].value=变量;这样就很少出错啦 何必那么烦呢? 在 sql 里写好存储过程,比如:create proc spinsert @par1 nvarchar(50), @par2 int, @par3 datetime, ... @parN typeNasinsert into table1 (col1, col2, col3, ... , colN)values (@par1, @par2, @par3, ... , @parN)go在程序中调用:string strSql = "spinsert '" + par1 + "', '" + par2 + "', '" + par3 + "', '" + ... parN + "'";// 被传递的参数顺序可以颠倒,但参数的类型必须匹配。SqlConnection cn = new SqlConnection(connectionString);SqlCommand cmd = new SqlCommand(strSql, cn);cn.Open();cmd.ExecuteNonQuery()// OK 楼上的,自己拼SQL语句会有SQL注入攻击的危险。string sSqlStr="InsertAllData";SqlCommand cmd = new SqlCommand(strSql, cn);cmd.CommandType=CommandType.StoredProcedure;这样一定不会有错的,设置CommandType为StoredProcedure的时候CommandString只能是存储过程的名字,不能有别的。如果还有错的话,把出错信息帖出来一下。如果要写成string sSqlStr="InsertAllData @sMod,@sNum,@dNumDate,@iN1,@iN2,@iN3,@iN4,@iN5,@iN6,@iN7,@iN8,@iN9";的形式,InsertAllData后面不应该跟@sMod这样的参数名,而应该跟参数的具体值,就像你在查询分析器里调用存储过程时写的语句一样。 而且CommandType要设置为Text。 漏了说了。 我不觉得我那样麻烦,反倒觉得那样标准,正像楼上所说自己拚sql容易被注入,解决的办法就是利用存储过程或者加验证,个人习惯问题,仅供参考 是呀,greennetboy的做法是存储过程的标准用法呀。 通用的方法:SQLCommand cmd = new SQLCommand("spGetAuthorByID", con);cmd.CommandType = CommandType.StoredProcedure;SQLParameter prmID = new SQLParameter("@AuthID", SQLDataType.VarChar,11);prmID.Value = "111-11-1111"cmd.SelectCommand.Parameters.Add(prmID); cmd.Execute(); 谢谢楼上的诸位帮助,我已经搞好!具体原因是存储过程中我使用SQLParameter的时候变量名和我的存储过程中的变量名不否导致了执行存储过程失败。后来我将存储过程中的变量和C#函数SQLParameter中的变量名改为一致即可。非常感谢大家! To cppTrier(cnblogs.com/hush):据个例子来瞅瞅! 小女子还是不太理解前缀表达式转后缀表达式,求大神指点迷津。。 datagridview格式化问题! 求解,rtf保存为图片。 外网的机器 如何连接到 内网的机器上? Point的坐标问题 访问Iframe的问题 菜鸟发问,一个关于WinForm子窗口的问题 在C#中 如何让DataGrid控件中的单元格有工具栏提示呀 一个继承的简单问题 为什么我的Visual Studio MVC新建项里 数据 里没有数据模型啊 调查表 C#?? 多线程和ThreadPool的问题,请高手指点。
EXECUTE InsertAllData @sMod,@sNum,@dNumDate,@iN1,@iN2,@iN3,@iN4,@iN5,@iN6,@iN7,@iN8,@iN9";
已经试过,依然抱错看过MSDN的例子,他们的
例子:OleDbCommand2.CommandText = "NewAuthor";
OleDbCommand2.CommandType = CommandType.StoredProcedure;// Set parameter values. In this case, all parameter values
// are strings.
OleDbCommand2.Parameters["au_id"].Value = TextBox1.Text;
OleDbCommand2.Parameters["au_lname"].Value = TextBox2.Text;
OleDbCommand2.Parameters["au_fname"].Value = TextBox3.Text;
...
...
...
...OleDbConnection2.Open();
try
{
cmdresults = OleDbCommand2.ExecuteNonQuery();
}
catch (Exception ex)
{
MessageBox.Show("Failed to execute command");
}
OleDbConnection2.Close();我的是用Parm,但是我使用CommandType.Text(这个是默认)就可以阿?怎么回事?
ms-help://MS.MSDNQTR.2003FEB.2052/vbcon/html/vbtskExecutingUpdatesOrDatabaseCommandsUsingDataCommand.htm
myCommand.CommandType=CommandType.StoredProcedure;
SalParameter param;
param=myCommand.Parameters.Add(("@sMod",SqlDbType.NVarChar,50);
param.Value=bo.Mod;
......
依然不行!
在线等
SqSqlCommand myCommand= new SqlCommand("InsertAllData",myConnection);
myCommand.CommandType=CommandType.StoredProcedure;
myCommand.Parameters.Add("@sMod",SqlDbType.NVarChar,50).Value=bo.Mod;使用存储过程只用名字就可以。
然后把必要的参数添加进去就可以。你的那个方法是个查询语句里面调用存储过程,所以要用myCommand.CommandType=CommandType.Text
这样不能把存储过程的优势发挥到极致。
我也试过,依然如此
SqlCommand cmd=new ("sp.存储过程名称",myconnection);
cmd.CommandType=CommandType.StoredProcedure;
cmd.Parameters.Add("参数名",SqlDbType.数据类型,数据长度);
cmd.Parameters["参数名"].value=变量;
这样就很少出错啦
@par1 nvarchar(50),
@par2 int,
@par3 datetime,
...
@parN typeN
asinsert into table1 (col1, col2, col3, ... , colN)
values (@par1, @par2, @par3, ... , @parN)go在程序中调用:string strSql = "spinsert '" +
par1 + "', '" +
par2 + "', '" +
par3 + "', '" +
...
parN + "'";// 被传递的参数顺序可以颠倒,但参数的类型必须匹配。SqlConnection cn = new SqlConnection(connectionString);
SqlCommand cmd = new SqlCommand(strSql, cn);
cn.Open();
cmd.ExecuteNonQuery()// OK
string sSqlStr="InsertAllData";
SqlCommand cmd = new SqlCommand(strSql, cn);
cmd.CommandType=CommandType.StoredProcedure;
这样一定不会有错的,设置CommandType为StoredProcedure的时候CommandString只能是存储过程的名字,不能有别的。如果还有错的话,把出错信息帖出来一下。
如果要写成
string sSqlStr="InsertAllData @sMod,@sNum,@dNumDate,@iN1,@iN2,@iN3,@iN4,@iN5,@iN6,@iN7,@iN8,@iN9";
的形式,InsertAllData后面不应该跟@sMod这样的参数名,而应该跟参数的具体值,就像你在查询分析器里调用存储过程时写的语句一样。
SQLCommand cmd = new SQLCommand("spGetAuthorByID", con);
cmd.CommandType = CommandType.StoredProcedure;
SQLParameter prmID = new SQLParameter("@AuthID", SQLDataType.VarChar,11);
prmID.Value = "111-11-1111"
cmd.SelectCommand.Parameters.Add(prmID);
cmd.Execute();
具体原因是存储过程中我使用SQLParameter的时候变量名和我的存储过程中的变量名不否导致了执行存储过程失败。后来我将存储过程中的变量和C#函数SQLParameter中的变量名改为一致即可。
非常感谢大家!