【问题标题】:DataGrid - SQL insert query error c#DataGrid - SQL插入查询错误c#
【发布时间】:2014-11-08 19:59:35
【问题描述】:

我正在尝试使用 sql 查询添加到表访问和数据网格行。购买没有成功。有任何想法吗 ?谢谢 我的 sql 查询:

DataBaseIkuns.Instance.InsertToDB(string.Format(DictionaryUtilsDB.dictioneary[DictionaryUtilsDB.CommendTypes.AddObserver], o.ID_Observer, o.Lat, o.Long, o.azimuth));

  public static Dictionary<CommendTypes, string> dictioneary = new Dictionary<CommendTypes, string>
        {
            {CommendTypes.AddObserver,"Insert into ShowTableObserver(ID_Ob,Lat,Long,Azimuth)"
            +"values('{0}','{1}','{2}','{3}')"},
            {CommendTypes.AzimuthLongLatFromOB,"SELECT ID_Observer,Longitude,Latitude,Azimuth FROM Observer Where  ID_Observer = {0}"}
        };



    public void InsertToDB(string sql) // It get the right values - 1,2,3,4
        {
            int insert = 0;
            try
            {
                if (con.State.ToString()== "Open")
                {
                    cmd = new OleDbCommand();
                    oledbAdapter = new OleDbDataAdapter();
                    dt = new DataTable();
                    cmd.Connection = con;
                    cmd.CommandText = sql;
                    insert = cmd.ExecuteNonQuery(); // Here it jump's to the catch. why ?

                    if (insert > 0)
                    {
                        MessageBox.Show("Your Insert successed");
                    }
                    else
                    {
                        MessageBox.Show("Your Insert failed");
                    }

                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

在程序所在的代码中添加注释。 sql下坠时的值:

Insert into ShowTableObserver(ID_Ob,Lat,Long,Azimuth)values('3','31.4','34','150')

【问题讨论】:

  • 在引发异常时,您能告诉我们sql 的值吗?
  • 是的,我编辑问题看看
  • 最重要的是知道在 catch 块中显示的确切错误消息。
  • 您是否使用 Access 数据库来存储您的数据?
  • 是的,我使用 access 作为我的数据库,因为我应该这样做。错误是查询中的语法错误。

标签: c# mysql sql-server wpf datagrid


【解决方案1】:

如果您在 OleDb 提供程序后面使用 Access 数据库,那么您会遇到 LONG 一词的问题。它是一个保留关键字(可能在许多其他数据库系统中也是如此)。在这种情况下,您需要将字段名称封装在方括号中

 {CommendTypes.AddObserver,"Insert into ShowTableObserver(ID_Ob,Lat,[Long],Azimuth)"

表示需要开始使用参数化查询。您的 string.Format 是另一种字符串连接,当您错过查询字符串中的单引号或其他类型说明符时,会导致 Sql 注入、解析问题和细微的语法错误

例如

public static Dictionary<CommendTypes, string> dictioneary = new Dictionary<CommendTypes, string>
{
    {CommendTypes.AddObserver,"Insert into ShowTableObserver(ID_Ob,Lat,Long,Azimuth)"
                              +"values(?,?,?,?)"},
    {CommendTypes.AzimuthLongLatFromOB,"SELECT ID_Observer,Longitude,Latitude,Azimuth " 
                              +"FROM Observer Where  ID_Observer = ?"}
};


public void InsertToDB(string sql, List<OleDbParameter> parameters)
{
    int insert = 0;
    try
    {
        if (con.State.ToString()== "Open")
        {
            using(cmd = new OleDbCommand());
            {
                 cmd.Connection = con;
                 cmd.CommandText = sql;
                 cmd.Parameters.AddRange(parameters.ToArray());
                 insert = cmd.ExecuteNonQuery(); 
            }
            ........
       }
    }
    ......
}

现在,当您调用 InsertDB 时,您编写

DataBaseIkuns.Instance.InsertToDB(string.Format(DictionaryUtilsDB.dictioneary[DictionaryUtilsDB.CommendTypes.AddObserver], , o.Lat, o.Long, o.azimuth));

List<OleDbParameter> parameters = new List<OleDbParameter>();
parameters.Add(new OleDbParameter()) 
{
      ParameterName = "@p1", OleDbType= OleDbType.VarWChar, Value = o.ID_Observer
}
parameters.Add(new OleDbParameter()) 
{
      ParameterName = "@p2", OleDbType= OleDbType.VarWChar, Value = o.Lat
}
parameters.Add(new OleDbParameter()) 
{
      ParameterName = "@p3", OleDbType= OleDbType.VarWChar, Value = o.Long
}
parameters.Add(new OleDbParameter()) 
{
      ParameterName = "@p4", OleDbType= OleDbType.VarWChar, Value = o.Azimuth
}
DataBaseIkuns.Instance.InsertToDB(
    DictionaryUtilsDB.dictioneary[DictionaryUtilsDB.CommendTypes.AddObserver], parameters);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-05
    • 1970-01-01
    相关资源
    最近更新 更多