![](/img/trans.png)
[英]Sql error “Procedure or function expects parameter , which was not supplied” when calling a stored procedure from c# code
[英]Error calling SQL Server stored procedure from C# code
我有一个存储过程,可以在SQL Server数据库中创建表。 我需要从C#调用此存储过程。 我有一个例外
@TABLENAME附近的语法不正确
我该如何解决? 我有一个xml文件中的表名和列列表。
存储过程:
CREATE PROCEDURE PROC_CREATE_SFCOM_TABLE2
@TABLENAME VARCHAR(4000) ,
@COLUMNLIST VARCHAR(4000) ,
@ERRORMSG VARCHAR(4000) OUTPUT
AS
BEGIN
SET NOCOUNT ON
DECLARE @EXEC_IMMEDIATE_VAR VARCHAR (4000)
SELECT @EXEC_IMMEDIATE_VAR = 'CREATE TABLE @TABLENAME@COLUMNLIST '
EXECUTE (@EXEC_IMMEDIATE_VAR)
END
GO
C#代码:
using (SqlConnection conn = new SqlConnection(connstring)
{
using (SqlCommand cmd = new SqlCommand("dbo.PROC_CREATE_SFCOM_TABLE2",conn))
{
cmd.CommandType = CommandType.StoredProcedure;
createScript = "("+columnScript+")";
if (tableTableSpace != null)
{
if (tableTableSpace != "" || tableTableSpace != string.Empty)
{
createScript += "TABLESPACE " + tableTableSpace;
}
}
SqlParameter parameter = new SqlParameter("@TableName",SqlDbType.NVarChar);
parameter.Direction = ParameterDirection.Input;
parameter.Value = tableName;
cmd.Parameters.Add(parameter);
SqlParameter parameter2 = new SqlParameter("@COLUMNLIST",SqlDbType.NVarChar);
parameter2.Direction = ParameterDirection.Input;
parameter2.Value = createScript;
cmd.Parameters.Add(parameter2);
SqlParameter parameter3 = new SqlParameter("@ErrorMsg", SqlDbType.NVarChar);
parameter3.Direction = ParameterDirection.Output;
parameter3.Size = 4000;
cmd.Parameters.Add(parameter3);
conn.Open();
cmd.ExecuteNonQuery();
string errorMsg = parameter3.Value.ToString();
if (errorMsg != string.Empty)
LogInfo("Error: " + errorMsg);
您无法参数化表或列的名称。 您只能参数化您的值。 唯一的方法是执行动态sql。
但是,如果要创建动态表,则应该对此进行非常强有力的验证。 例如,为此创建一个白名单。
在执行此操作之前,请阅读: 动态SQL的诅咒和祝福
您没有正确创建动态SQL字符串。 改成这个...
CREATE PROCEDURE PROC_CREATE_SFCOM_TABLE2
@TABLENAME VARCHAR(4000) ,
@COLUMNLIST VARCHAR(4000) ,
@ERRORMSG VARCHAR(4000) OUTPUT
AS
BEGIN
SET NOCOUNT ON
DECLARE @EXEC_IMMEDIATE_VAR VARCHAR (4000)
SELECT @EXEC_IMMEDIATE_VAR = 'CREATE TABLE [' + @TABLENAME + '] ' + @COLUMNLIST
EXECUTE (@EXEC_IMMEDIATE_VAR)
END
GO
但是,请注意,这是非常危险的事情。 @COLUMNLIST可以包含任何内容,包括其他SQL命令,这些命令可以用于SQL注入攻击
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.