【问题标题】:SqlCommand insertion querySqlCommand插入查询
【发布时间】:2013-05-03 09:48:43
【问题描述】:

我必须在我的 c# 代码中执行插入查询

connexion = new SqlConnection(connexionString);
             connexion.Open();
            List<int> liste = client.GetIDFichiers(1210);
            int a = 2;
            foreach (int idfichier in liste)
            {
                a++;
                using (connexion)
                {
                  using (SqlCommand sqlCmd = new SqlCommand("INSERT INTO REL_Fab3DLotFichier_Fichier3D (IDREL_Fab3DLotFichier_Fichier3D,IDFichier3D,IDFab3DLotFichier,CreePar,CreeLe,ModifiePar,DateMaj,EstActif) VALUES (" + a + "," + idfichier + "," + 17965 + "," + null + "," + null + "," + null + "," + null + "," + 1 + ")", connexion))
                    {
                        try
                        {
                            sqlCmd.ExecuteNonQuery();
                        }
                        catch (Exception ex) { MessageBox.Show(ex.ToString()); }

                    }
                }

            }

插入不起作用,我不知道为什么。选择和删除查询工作正常。只有当我尝试插入值时才会出现语法错误。

  • 什么是语法错误?
  • 我该如何解决?

【问题讨论】:

  • 请注明错误...
  • 显示表架构
  • 哇,我应该从哪里开始!首先,您将整数与字符串和空值连接起来。其次...考虑参数化查询。
  • 始终使用参数化查询。它将防止 SQL 注入攻击。

标签: c# sql sql-server insert sql-insert


【解决方案1】:

什么是语法错误?我该如何解决?

是的。使用参数化 SQL 语句。

string sql = "INSERT INTO TableName (Column1,Column2) VALUES (@value1,@value2)";
using(SqlCommand sqlCmd = new SqlCommand(sql,connection))
{
 sqlCmd.Parameters.Add("@value1",SqlDbType.Varchar,20).Value = varName1;
 sqlCmd.Parameters.Add("@value2",SqlDbType.Varchar,20).Value = DBNull.Value;
 ...
 }

尝试包含非空字段以准备 INSERT SQL。

sql=@"INSERT INTO REL_Fab3DLotFichier_Fichier3D 
                (IDREL_Fab3DLotFichier_Fichier3D,
                 IDFichier3D,
                 IDFab3DLotFichier,
                 DateMaj,EstActif) 
     VALUES 
                (@IDREL_Fab3DLotFichier_Fichier3D,
                 @IDFichier3D,
                 @IDFab3DLotFichier,
                 @DateMaj,@EstActif)";

【讨论】:

    【解决方案2】:

    您传递的某些值可能是字符串/varchar 对象,并且您没有用引号将它们包装起来:

    new SqlCommand("INSERT INTO REL_Fab3DLotFichier_Fichier3D (IDREL_Fab3DLotFichier_Fichier3D,IDFichier3D) VALUES ('" + a + "', '" + idfichier + "')", connexion);
    

    确实,正如 AVD 建议的那样,您应该使用参数化,这不太容易受到注入攻击。

    【讨论】:

      【解决方案3】:

      请将您的字符串值用单引号括起来,如下所示

       New SqlCommand("insert into Type(TypeName,TypeOrder,CategoryID) values ('" + txtType1.Text + "','" + txtOrder.Text + "','" + ViewState("CatID").ToString() + "')", con)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-05
        • 1970-01-01
        • 1970-01-01
        • 2012-10-08
        • 1970-01-01
        • 2017-09-22
        • 2013-07-08
        • 1970-01-01
        相关资源
        最近更新 更多