【问题标题】:Insert into statement with file path插入带有文件路径的语句
【发布时间】:2018-02-19 10:25:11
【问题描述】:
string SqlStr = string.Format("insert into O_Tracker " +
           "(order_id,client_name,job_name,note_,s_date,e_date,paid,pickup_status,sub_orders) values " +
           "({0},'{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}')"      
           ,s.Order_Id, s.Client_Name, s.Job_Name, s.Note, s.Start_Date,
           s.End_Date, s.Paid, s.Ready2Pickup, subOrdersPath);

我不断从调试器中收到此错误:

查询表达式中的语法错误(缺少运算符)

我只是想不通这里出了什么问题。 提前感谢您的帮助。

更新: 我已将代码更改为带参数的格式,并出现“不匹配条件表达式访问”错误。

string SqlStr ="insert into O_Tracker " + "(order_id,client_name,job_name,note_,s_date,e_date,paid,pickup_status,sub_orders) values(@order_id,@client_name,@job_name,@note_,@s_date,@e_date,@paid,@pickup_status,@sub_orders)";

        OleDbCommand cmd = new OleDbCommand();
        cmd.Parameters.AddWithValue("@order_id", s.Order_Id);
        cmd.Parameters.AddWithValue("@client_name", s.Client_Name);
        cmd.Parameters.AddWithValue("@job_name", s.Job_Name);
        cmd.Parameters.AddWithValue("@note_", s.Note);
        cmd.Parameters.AddWithValue("@s_date", s.Start_Date);
        cmd.Parameters.AddWithValue("@e_date", s.End_Date);
        cmd.Parameters.AddWithValue("@paid", s.Paid);
        cmd.Parameters.AddWithValue("@pickup_status", s.Ready2Pickup);
        cmd.Parameters.AddWithValue("@sub_orders", subOrdersPath);

        try
        {             
            cnn.Open();
            cmd.Connection = cnn;
            cmd.CommandText = SqlStr; 
            cmd.ExecuteNonQuery();
        }
        catch (OleDbException ex)
        {
            MessageBox.Show(ex.Message);
        }
        finally
        {              
            cnn.Close();
        }

总结

将文件路径添加到特定表字段时出现问题。 这里的人注意到我的代码容易受到 SQL 注入的影响,所以我按照他们的建议完成并修复了我的代码。

之后又出现了另一个问题,由于日期字段不匹配,因此简单地修复了它。

感谢大家的帮助! :)

【问题讨论】:

  • 发生异常时SqlStr确切值是多少?
  • @mjwills "insert into O_Tracker (order_id,client_name,job_name,note_,s_date,e_date,paid,pickup_status,sub_orders) values (1001,'Example','gssgsgsgsgs','אין הערות','19/02/2018 12:21:36','19/02/2018 12:21:36','לא','לא','C:\\Users\\SuperUser\\Dropbox\\My Project\\My Project\\bin\\Debug\\\\Orders\\1001gssgsgsgsgs.txt')"
  • 在 SqlCommand 中使用参数。你不应该发送这样的格式化字符串。
  • 当 subOrdersPath = "'); DROP TABLE O_Tracker--" 时会发生什么? Sql 注入刚刚杀死了你的数据库!

标签: c# sql winforms visual-studio


【解决方案1】:

看起来您的字符串 ')' 被视为单独的字符串:

1001gssgsgsgsgs.txt')'

话虽如此,正如 cmets 中所说,您必须使用 SqlParameters。既可以防止 Sql 注入,也可以分隔字符串。像这样的:

SqlCommand command = new SqlCommand('insert into ... values (..., @sub_order)', connection);
command.Parameters.Add("@sub_order", yourSubOrderString);

【讨论】:

  • 你能解释一下我是如何用这种方法将插入写入查询的吗? 'insert into MyTable (... table fields) values (...,@sub_orders)''insert into My table values (...,@sub_orders)'
  • 表格字段是可选的,但最好包含它们,这样如果您的数据库字段的顺序由于某种原因发生变化,它仍然有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多