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));";
但我想通过用文本框替换上面字符串中的表名来动态创建表名。短信,我该怎么做?非常感谢
通常我会说"不要这样做",因为在查询中插入用户输入会打开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();
}
}