【问题标题】:Why is there an incorrect syntax near varchar [closed]为什么 varchar 附近的语法不正确 [关闭]
【发布时间】:2014-06-06 13:58:14
【问题描述】:

我正在读取 CSV 文件,然后写入 SQL 表。在使用以下代码写入表之前,我正在动态创建表:

string exists = null;

try
{
    SqlCommand cmd = new SqlCommand("SELECT * FROM sysobjects where name = '" + tbTable.Text + "'", myConnection);
    exists = cmd.ExecuteScalar().ToString();
}
catch (Exception exce)
{
    exists = null;
}

if (exists == null)
{
   foreach (DataColumn dc in dt.Columns)
   {
      if (exists == null)
      {
         SqlCommand createtable = new SqlCommand("CREATE TABLE " + tbTable.Text + " (" + dc.ColumnName + " varchar(MAX))", myConnection);
         createtable.ExecuteNonQuery();
         exists = tbTable.Text;
      }
      else
      {
         SqlCommand addcolumn = new SqlCommand("ALTER TABLE " + tbTable.Text + " ADD " + dc.ColumnName + " varchar(MAX)", myConnection);
         addcolumn.ExecuteNonQuery();
      }
   }

   using (SqlBulkCopy bulkCopy = new SqlBulkCopy(myConnection))
   {
       try
       {
           bulkCopy.DestinationTableName = tbTable.Text;
           bulkCopy.WriteToServer(dt);
           tbTable.Enabled = true;
       }
       catch (Exception ex)
       {
          MessageBox.Show(ex.Message.ToString(), "Program Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
          tbTable.Enabled = true;
       }
    }
 }

我不断收到以下错误:

SqlException 未处理:'varchar' 附近的语法不正确

以下几行:

SqlCommand addcolumn = new SqlCommand("ALTER TABLE " + tbTable.Text + " ADD " + dc.ColumnName + " varchar(MAX)", myConnection);
addcolumn.ExecuteNonQuery();`

代码要做的是检查表是否存在,如果存在但列不匹配,则添加新列以匹配 CSV 文件。

我该如何解决?

【问题讨论】:

  • 您是否确认在文本连接后该命令会评估什么?然后您是否针对您的数据库运行该 SQL 以验证它是否有效?
  • 你为什么要捕捉和吃掉所有有价值的异常?
  • 我建议您对 SQL 查询使用参数而不是字符串连接,然后调试您的程序,获取查询字符串,然后在您的查询工具中运行它以查看它在做什么。
  • 我有相同的代码可以从 DBF 中读取,并且工作正常。
  • 您使用的是什么数据库平台? Oracle、Sql Server、MySql?

标签: c# sql sql-server csv


【解决方案1】:

您必须将列名用引号括起来,如下所示:

SqlCommand addcolumn = new SqlCommand("ALTER TABLE " + tbTable.Text +
               " ADD '" + dc.ColumnName + "' varchar(MAX)", myConnection);

注意多余的单引号。

此外,在查询中连接用户输入(例如,tbTable.Text)非常危险。您应该改用参数化查询。

【讨论】:

  • 感谢您的回答。一些列名有我没有意识到的空间,所以我为列名添加了[],它可以工作!
  • 这是一个只读文本框,从文件名中显示,所以我现在并不担心,但我同意你的观点。谢谢。
猜你喜欢
  • 2015-12-12
  • 1970-01-01
  • 2021-03-22
  • 2020-11-03
  • 2018-10-25
  • 2013-06-26
  • 2020-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多