我的update()
方法遇到了一些问题。想法是用户提供食谱名称,成分,说明,然后使用文件流选择图像。
一旦用户点击“添加配方”,这将调用更新方法,但是就目前情况而言,我收到一个错误,提到了文本框的内容:
这是update()方法代码:
private void updatedata()
{
// filesteam object to read the image
// full length of image to a byte array
try
{
// try to see if the image has a valid path
if (imagename != "")
{
FileStream fs;
fs = new FileStream(@imagename, FileMode.Open, FileAccess.Read);
// a byte array to read the image
byte[] picbyte = new byte[fs.Length];
fs.Read(picbyte, 0, System.Convert.ToInt32(fs.Length));
fs.Close();
//open the database using odp.net and insert the lines
string connstr = @"Server=mypcname\SQLEXPRESS;Database=RecipeOrganiser;Trusted_Connection=True";
SqlConnection conn = new SqlConnection(connstr);
conn.Open();
string query;
query = "insert into Recipes(RecipeName,RecipeImage,RecipeIngredients,RecipeInstructions) values (" + textBox1.Text + "," + " @pic" + "," + textBox2.Text + "," + textBox3.Text + ")";
SqlParameter picparameter = new SqlParameter();
picparameter.SqlDbType = SqlDbType.Image;
picparameter.ParameterName = "pic";
picparameter.Value = picbyte;
SqlCommand cmd = new SqlCommand(query, conn);
cmd.Parameters.Add(picparameter);
cmd.ExecuteNonQuery();
MessageBox.Show("Image successfully saved");
cmd.Dispose();
conn.Close();
conn.Dispose();
Connection();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
任何人都可以看到我在插入Recipes查询时出错了,或者建议对这部分代码采用替代方法吗?
答案 0 :(得分:3)
您的代码对SQL注入是开放的,但可能您的错误来自包含单引号的某些文本(例如说明字段),这会使用连接用户输入来破坏命令字符串构建。
修改强> 正如有人指出评论错误是由文本框周围缺少引号引起的。但是虽然很容易解决这个问题,但是因为修复错误添加缺少的引号是错误的。这只是推迟问题,留下一个巨大的安全漏洞等待被利用。
参数化查询可以避免所有这些混乱。
string connstr = "....";
string query = "insert into Recipes(RecipeName,RecipeImage,RecipeIngredients,RecipeInstructions) " +
"values (@name, @pic, @ing, @instr)";
using(SqlConnection conn = new SqlConnection(connstr))
using(SqlCommand cmd = new SqlCommand(query, conn))
{
conn.Open();
SqlParameter picparameter = new SqlParameter();
picparameter.SqlDbType = SqlDbType.Image;
picparameter.ParameterName = "@pic";
picparameter.Value = picbyte;
cmd.Parameters.Add(picparameter);
cmd.Parameters.AddWithValue("@name", textbox1.Text);
cmd.Parameters.AddWithValue("@ing", textbox2.Text);
cmd.Parameters.AddWithValue("@instr", textbox3.Text);
cmd.ExecuteNonQuery();
MessageBox.Show("Image successfully saved");
}
答案 1 :(得分:3)
由于你使用字符串连接,你可能错过了一个引用,或者你输了一个额外的引用或者错过了一个逗号或者添加了额外的逗号等等....
不要这样使用!
您的错误看起来并不明显,但您应始终使用parameterized queries
。这种字符串连接对SQL Injection
攻击是开放的。
query = "insert into Recipes(RecipeName,RecipeImage,RecipeIngredients,RecipeInstructions) values (@p1, @pic, @p3, @p4)";
SqlCommand cmd = new SqlCommand(query, conn);
cmd.Parameters.AddWithValue(@p1, textBox1.Text);
cmd.Parameters.AddWithValue(@pic, textBox1.Text);
cmd.Parameters.AddWithValue(@p3, textBox1.Text);
cmd.Parameters.AddWithValue(@p4, picparameter);
答案 2 :(得分:1)
试试这个
query =“插入食谱(RecipeName,RecipeImage,RecipeIngredients,RecipeInstructions)值('”+ textBox1.Text +“',”+“@ pic”+“,'”+ textBox2.Text +“',' “+ textBox3.Text +”')“;