【问题标题】:SQLCommand, create tableSQLCommand,创建表
【发布时间】:2018-04-18 09:05:41
【问题描述】:

我想在单击按钮后在我的数据库中创建表。在 Button_Click 函数中我有一个代码

SqlConnection conn = new SqlConnection(@"MyConnectionString");

conn.Open();

SqlCommand cmd = new SqlCommand("CREATE TABLE '" + tableName+ "' (IdPy INT IDENTITY(1,1), Question NVARCHAR (MAX) NOT NULL, IsChecked BIT NOT NULL,  CONSTRAINTPK_'" + tableName+ "' PRIMARY KEY(Id) )", conn);

cmd.ExecuteNonQuery();
conn.Close();

tableName 是我的String 变量(它的值2018-04-18 asd - 是的,我想要具有这样名称的表)。单击按钮后出现错误:

System.Data.SqlClient.SqlException:''2018-04-18 asd' 附近的语法不正确。'

我认为问题出在我的 SqlCommand 中。如果您能帮我解决这个问题,我将不胜感激。

【问题讨论】:

  • 你有没有通过调试器检查过SqlCommand的文本?
  • 请检查tableName的值(下断点)
  • 你可能会发现你需要把 [] 放在表名而不是单引号
  • 我的tableName值为“2018-04-18 asd”
  • 检查 CONSTRAINTPK_'" + tableName+ "' ...这将导致 CONSTRAINTPK_'myTable'

标签: c# sql sqlcommand


【解决方案1】:

看起来tableName 变量是2018-04-18 asd。如果这确实是正确的表名,则需要在方括号中转义它(和约束):

SqlCommand cmd = new SqlCommand("CREATE TABLE [" + tableName + "] (IdPy INT IDENTITY(1,1), Question NVARCHAR (MAX) NOT NULL, IsChecked BIT NOT NULL, CONSTRAINT [CONSTRAINTPK_" + tableName+ "] PRIMARY KEY(Id) )", conn);

【讨论】:

  • 我收到此错误:System.Data.SqlClient.SqlException: 'The definition for column 'CONSTRAINTPK_2018-04-18asd' must include a data type.'
  • @MrNobody 我想知道你是否错过了空格BIT NOT NULL, CONSTRAINT_MISSING_SPACE_PK_
  • @bradbury9 你是对的。有用。感谢您的反馈意见。 :)
【解决方案2】:

你应该转义[...] 在 MS SQL 的情况下)tableconstraint 名称:

  //DONE: wrap IDisposable into using
  using(SqlConnection conn = new SqlConnection(@"MyConnectionString")) {
    conn.Open();

    //DONE: Make sql readable. Can you see that you've skipped CONSTRAINT keyword?
    string sql = 
      $@"CREATE TABLE [{tableName}] (
           -- Fields
           IdPy      INT IDENTITY(1,1),
           Question  NVARCHAR (MAX)     NOT NULL, 
           IsChecked BIT                NOT NULL,

           -- Constraints
           --DONE: Constraint key word (optional in some RDBMS) added 
           CONSTRAINT [CONSTRAINTPK_{tableName}] PRIMARY KEY(Id) 
         )";

    //DONE: wrap IDisposable into using
    using (qlCommand cmd = new SqlCommand(sql, conn)) {
      cmd.ExecuteNonQuery();
    }
  } 

【讨论】:

    【解决方案3】:

    使用字符串变量和参数化字符串格式可能更容易识别 SQLCommand 的问题。一个例子:

    string query = "CREATE TABLE @tablename (IdPy INT IDENTITY(1,1), 
    Question NVARCHAR (MAX) NOT NULL, IsChecked BIT NOT NULL,  
    CONSTRAINTPK_@tablename PRIMARY KEY(Id) )";
    
    string param = new {@tablename = txttable.txt(example)};
    
    SqlCommand cmd = new SqlCommand(query, param, conn);
    

    这可能有助于逐步确保您必须检查的变量更加简洁。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-08
      • 2020-01-31
      • 1970-01-01
      • 1970-01-01
      • 2012-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多