簡體   English   中英

從C#代碼調用SQL Server存儲過程時出錯

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM