C#, sqlcommand string

本文关键字:string sqlcommand | 更新日期: 2023-09-27 18:01:09

我有一个SqlCommand字符串来创建SqlServer数据表,如下所示:

`string EFTGeneral = @`"CREATE TABLE [EFT.GER2] (
                                [TestOrderName]   VARCHAR(20)  NOT NULL,    
                                [Template]        VARCHAR(50)  NULL,
                                [Purpose]         VARCHAR(100) NULL,
                                [Category]        VARCHAR(50)  NULL,
                                [DateCreated]         DATETIME NULL,
                                [CreatedBy]       VARCHAR(30)  NULL,
                                [TestObjectBatch] VARCHAR(20)  NULL,
                                [LoadDirection]   VARCHAR(2)   NULL,
                                [ElementType]     VARCHAR(10)  NULL,
                                [FatigueTestType] VARCHAR(50)  NULL,
                                [LoadAmplitude]            INT NULL,
                                [LoadStatic]      INT NULL,
                                [UntilBreakage]   VARCHAR(5)   NULL,
                                [NumberOfObject]           INT NULL,
                                [Remarks]         VARCHAR(200) NULL,
                                PRIMARY KEY CLUSTERED([TestOrderName] ASC));";

但我想通过用文本框替换上面字符串中的表名来动态创建表名。短信,我该怎么做?非常感谢

C#, sqlcommand string

通常我会说"不要这样做",因为在查询中插入用户输入会打开SQL注入漏洞。正确的方法是使用参数化查询。

不幸的是,参数只能用于值,而不能用于表或列名。因此,为了方便地替换查询中的表名,您可以简单地执行类似的Replace()

EFTGeneral = EFTGeneral.Replace("[EFT.GER2]", "[" + textBox.Text + "]");

但是您应该确保textBox.Text是一个有效的表名,而不是类似于"; DROP TABLE Users --"的名称。这个答案显示了如何验证表名。

这是我的代码,现在我可以随心所欲地创建SQL表名称:

try
            {
               string EFTGeneral = @"CREATE TABLE [EFTGNR] (
                                [TestOrderName]   VARCHAR(20)  NOT NULL,    
                                [Template]        VARCHAR(50)  NULL,
                                [Purpose]         VARCHAR(100) NULL,
                                [Category]        VARCHAR(50)  NULL,
                                [DateCreated]         DATETIME NULL,
                                [CreatedBy]       VARCHAR(30)  NULL,
                                [TestObjectBatch] VARCHAR(20)  NULL,
                                [LoadDirection]   VARCHAR(2)   NULL,
                                [ElementType]     VARCHAR(10)  NULL,
                                [FatigueTestType] VARCHAR(50)  NULL,
                                [LoadAmplitude]            INT NULL,
                                [LoadStatic]      INT NULL,
                                [UntilBreakage]   VARCHAR(5)   NULL,
                                [NumberOfObject]           INT NULL,
                                [Remarks]         VARCHAR(200) NULL,
                                PRIMARY KEY CLUSTERED([TestOrderName] ASC));";
                ////
                SqlConnection conn = new SqlConnection(ConnString);
                conn.Open();
                EFTGeneral = EFTGeneral.Replace("[EFTGNR]", "[" + txtbox_testorder.Text + ".GERNERAL]");
                SqlCommand cmd = new SqlCommand(EFTGeneral, conn);
                cmd.ExecuteNonQuery();
                conn.Close();
            }catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

使用SqlCommand动态构建查询以避免注入风险:

string EFTGeneral = @"CREATE TABLE [EFT.@tableName] (
                                [TestOrderName]   VARCHAR(20)  NOT NULL,    
                                [Template]        VARCHAR(50)  NULL,
                                [Purpose]         VARCHAR(100) NULL,
                                [Category]        VARCHAR(50)  NULL,
                                [DateCreated]         DATETIME NULL,
                                [CreatedBy]       VARCHAR(30)  NULL,
                                [TestObjectBatch] VARCHAR(20)  NULL,
                                [LoadDirection]   VARCHAR(2)   NULL,
                                [ElementType]     VARCHAR(10)  NULL,
                                [FatigueTestType] VARCHAR(50)  NULL,
                                [LoadAmplitude]            INT NULL,
                                [LoadStatic]      INT NULL,
                                [UntilBreakage]   VARCHAR(5)   NULL,
                                [NumberOfObject]           INT NULL,
                                [Remarks]         VARCHAR(200) NULL,
                                PRIMARY KEY CLUSTERED([TestOrderName] ASC));";
using (SqlConnection connection = new SqlConnection(yourConnectionString))
{
    using (SqlCommand command = new SqlCommand(EFTGeneral, connection))
    {
        SqlParameter tableNameParam = new SqlParameter("tableName", SqlDbType.Varchar);
        tableNameParam.Value = textBox.Text;
        command.Parameters.Add(tableNameParam);
        command.ExecuteNonQuery();
    }
}