【问题标题】:How to fix an error in SQL query in a Winforms application如何修复 Winforms 应用程序中的 SQL 查询错误
【发布时间】:2019-04-13 17:54:17
【问题描述】:

我正在尝试将数据插入到名为 ansat (vagtplan) 的表中。我目前正在编写一个使用 SQL Server 数据库的 WinForms 应用程序,但我仍然收到错误,并且我无法在代码中真正看到错误所在。

我认为,这一定是 SQL 查询的错误,因为当我尝试按下按钮向表中插入数据时,我收到以下错误消息:

“ansatID、Navn、Efternavn、Adresse、Email、Mobilnr”附近的语法不正确。

所需的结果是带有“已保存”的消息框,它将确认数据已插入到表 ansat(vagtplan) 中。查询了很多次,但我并不能真正看到错误在哪里,所以我的问题是:错误在哪里?也许应该以另一种方式制定查询?代码如下:

private void button1_Click(object sender, EventArgs e)
{
   try
    {
        String ConnectionString = @"Data Source=.\SQLEXPRESS01;Initial Catalog=Vagtplan;Integrated Security=True";
        SqlConnection myconnection = new SqlConnection(ConnectionString);
        myconnection.Open();

        SqlCommand AddCommand = myconnection.CreateCommand();
        AddCommand.CommandText = "INSERT INTO ansat(vagtplan) ([ansatID, Navn, Efternavn, Adresse, Email, Mobilnr]) VALUES (@ansatID, @Navn, @Efternavn, @Adresse, @Email, @Mobilnr)";

        AddCommand.Parameters.AddWithValue("@ansatID", textBox8.Text);
        AddCommand.Parameters.AddWithValue("@Navn", textBox1.Text);
        AddCommand.Parameters.AddWithValue("@Efternavn", textBox2.Text);
        AddCommand.Parameters.AddWithValue("@Adresse", textBox3.Text);
        AddCommand.Parameters.AddWithValue("@Email", textBox6.Text);
        AddCommand.Parameters.AddWithValue("@Mobilnr", textBox7.Text);

        AddCommand.ExecuteNonQuery();

        myconnection.Close();
        MessageBox.Show("Saved");
    } 
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

【问题讨论】:

  • 表名后不需要指定数据库名。 (vagtplan) 而且您不要在列列表的开头和和处放置方括号。如果您想使用它们,请将它们放在每个列名称周围 [ansatID], [Navn],...
  • 您还应该处理连接(以及 DBCommand 对象)并避免使用AddWithValue()
  • [ansatID, Navn, Efternavn, Adresse, Email, Mobilnr] 表示名称为ansatID, Navn, Efternavn, Adresse, Email, Mobilnr单个 列;我怀疑这就是你所追求的。您引用个别列,[ansatID], [Navn],...
  • 老实说,也不确定INSERT INTO ansat(vagtplan) ([ansatID,... 是什么。 vagtplan 是另一个专栏吗?如果是这样,它应该与其他列在同一个括号中。
  • @Larnu ansatID, Navn, Efternavn, Adresse, Email, Mobilnr 是每个单独的列,vagtplan 是数据库的名称,ansat 是表的名称,所以它被称为 ansat( vagtplan)

标签: c# sql sql-server winforms insert


【解决方案1】:

插入语句错误。应该是这样的:

INSERT INTO ansat(ansatID, Navn, Efternavn, Adresse, Email, Mobilnr) 
VALUES(@ansatID, @Navn, @Efternavn, @Adresse, @Email, @Mobilnr)

不需要指定数据库,因为它已经在连接字符串中提到了。

【讨论】:

  • 我已经尝试过了,但我收到以下错误消息:无效的对象名称'ansat'。
  • 那么你的桌子@PawełŻelazny是什么?您应该能够调试该问题。 :)
  • 如果您的表名为“ansat(vagtplan)”,请尝试将其重命名为“ansat”。表格中的特殊字符被认为是不好的做法。
【解决方案2】:

您可以尝试以下查询:

INSERT INTO vagtplan.dbo.ansat ([ansatID], [Navn], [Efternavn], [Adresse], [Email], [Mobilnr]) values (@ansatID, @Navn, @Efternavn, @Adresse, @Email, @Mobilnr)

【讨论】:

  • 我已经尝试过了,但我仍然收到错误消息:Invalid object name 'ansat'。
  • 试试这个:INSERT INTO [vagtplan]..[ansat]
【解决方案3】:

问题在于您的命令文本"INSERT INTOansat(vagtplan) ([ansatID, Navn, Efternavn, Adresse, Email, Mobilnr]) values (@ansatID, @Navn, @Efternavn, @Adresse, @Email, @Mobilnr)";

INSERT 语句语法为:Insert into <tableName>(<column1>,<column2>) Values(<column1Value>,<column2Value>);

  1. 您的INSERT 语句的表名似乎错误。似乎ansat 是模式名,vagtplan 是表名,它应该像ansat.vagtplan[ansat].[vagtplan]
  2. 列名应该类似于[column1],[column2]。您已在单个 [] 中添加了所有列;这是错误的。

【讨论】:

    【解决方案4】:

    右键单击 SQL Server Management Studio 中的表,然后编写脚本,然后插入到脚本中。这将为您提供一个用于插入表的 SQL 插入脚本。您可以使用此脚本作为创建代码的基础。

    【讨论】:

      【解决方案5】:

      感谢所有回复 :) 我已经弄清楚了,现在可以使用了,但是又出现了另一个问题。现在我正在尝试通过外键将数据插入到彼此相关的两个表中。表 dbo.Ansatte 有一个名为 ansatID 的主键,表 dbo.Login_data 有一个名为 brugerID 的主键和一个外键 AnsatID,它引用表 dbo.Ansatte 中的主键 ansatID。两个表中的主键是在查询运行时增量插入的。我试图将 IDENTITY_INSERT 设置为 ON(在 ms sql server management studio 中),但它没有帮助,因为我仍然收到 IDENTITY_INSERT 设置为 OFF 的错误消息。问题是,在运行查询之后,表 dbo.Login_data 中的外键 AnsatID 仍然为 NULL,尽管外键 AnsatID 引用了表 dbo.Ansatte 中称为 ansatID 的主键。期望的结果是表 dbo.Login_data 中的外键 AnsatID 与表 dbo.Ansatte 中的主键 ansatID 具有相同的值。这也显示在下图中: enter image description here

      那么,如何将值从主键转化为外键呢? 这是我的代码:

      private void button1_Click(object sender, EventArgs e)
          {
              {
                  try
                  {
                      String ConnectionString = @"Data Source=.\SQLEXPRESS01;Initial Catalog=Vagtplan;Integrated Security=True";
                      SqlConnection myconnection = new SqlConnection(ConnectionString);
                      myconnection.Open();
      
                      SqlCommand AddWorkerCommand = myconnection.CreateCommand();
                      AddWorkerCommand.CommandText = "INSERT INTO dbo.Ansatte ([Navn], [Efternavn], [Adresse], [Postnummer], [Bynavn], [Email], [Mobilnr]) VALUES ( @Navn, @Efternavn, @Adresse, @Postnummer, @Bynavn, @Email, @Mobilnr)";
      
                      AddWorkerCommand.Parameters.AddWithValue("@Navn", textBox1.Text);
                      AddWorkerCommand.Parameters.AddWithValue("@Efternavn", textBox2.Text);
                      AddWorkerCommand.Parameters.AddWithValue("@Adresse", textBox3.Text);
                      AddWorkerCommand.Parameters.AddWithValue("@Postnummer", textBox4.Text);
                      AddWorkerCommand.Parameters.AddWithValue("@Bynavn", textBox5.Text);
                      AddWorkerCommand.Parameters.AddWithValue("@Email", textBox6.Text);
                      AddWorkerCommand.Parameters.AddWithValue("@Mobilnr", textBox7.Text);
                      AddWorkerCommand.ExecuteNonQuery();
      
                      SqlCommand AddUserCommand = myconnection.CreateCommand();
                      AddUserCommand.CommandText = "INSERT INTO dbo.Login_data ([Brugernavn], [Adgangskode], [Brugertype]) VALUES ( @Brugernavn, @Adgangskode, @Brugertype)";
      
                      AddUserCommand.Parameters.AddWithValue("@Brugernavn", textBox10.Text);
                      AddUserCommand.Parameters.AddWithValue("@Adgangskode", textBox9.Text);
                      AddUserCommand.Parameters.AddWithValue("@Brugertype", textBox8.Text);
                      AddUserCommand.ExecuteNonQuery();
      
                      myconnection.Close();
                      MessageBox.Show("Saved");
                  }
      
                  catch (Exception ex)
                  {
                      MessageBox.Show(ex.Message);
                  }
      
      
              }
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-25
        • 1970-01-01
        • 1970-01-01
        • 2020-11-29
        • 1970-01-01
        • 2014-05-23
        相关资源
        最近更新 更多