我有一个SqlCommand字符串来创建一个SqlServer Data表,如下所示:
`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));";
但我想通过textbox.Text替换上面字符串中的表名来动态创建表名,我该怎么做?非常感谢你
答案 0 :(得分:0)
通常我会说“不要这样做”,因为在查询中插入用户输入会打开SQL injection漏洞。正确的方法是使用参数化查询。
不幸的是,参数只能用于值,而不能用于表名或列名。因此,要轻松替换查询中的表名,您只需执行Replace()
,即:
EFTGeneral = EFTGeneral.Replace("[EFT.GER2]", "[" + textBox.Text + "]");
但您应该确保textBox.Text
是有效的表名,而不是"; DROP TABLE Users --"
。 This answer显示了如何验证表名。
答案 1 :(得分:0)
使用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();
}
}
答案 2 :(得分:0)
这是我的代码,现在我可以根据需要创建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);
}