尝试从数据库中查看图像时,我遇到了一个奇怪的语法错误。声明操作符附近的语法错误是错误的。我不知道发生了什么,因为我很确定这一切都没问题,直到它运行。
“'='
附近的语法不正确
查看图片代码
using (SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\v11.0; AttachDbFilename=C:\Users\Donald\Documents\Visual Studio 2013\Projects\DesktopApplication\DesktopApplication\Student_CB.mdf ;Integrated Security=True"))
{
con.Open();
try
{
string sql = "Select Image, Image_Name FROM Recipe_Image Where Image_ID =" + imageidTxt.Text + "";
if (con.State != ConnectionState.Open)
con.Open();
command = new SqlCommand(sql, con);
SqlDataReader reader = command.ExecuteReader();
reader.Read();
if(reader.HasRows)
{
nameTxt.Text = reader[0].ToString();
byte[] img = (byte[])(reader[1]);
if (img == null)
picImg.Image = null;
else
{
MemoryStream ms = new MemoryStream(img);
picImg.Image = Image.FromStream(ms);
}
}
con.Close();
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
con.Close();
}
答案 0 :(得分:4)
您的SQL语法无效,主要是因为您实际上并未控制它。 (你有什么称为SQL Injection Vulnerability。)而不是将用户输入值作为代码执行,将它们视为值。首先,使用参数占位符定义静态查询:
string sql = "Select Image, Image_Name FROM Recipe_Image Where Image_ID = @Image_ID";
然后在构建SqlCommand
对象时,为该占位符添加一个参数:
// the query implies that the ID is a number, so make it a number...
int imageId = 0;
if (!int.TryParse(imageidTxt.Text, out imageId)
{
// entered text wasn't a number, return an error?
}
// then add that number as a parameter
command.Parameters.Add("@Image_ID", SqlDbType.Int).Value = imageId;
这样您就可以在设计时定义静态查询,而不是在运行时构建动态(当前未知)。因此,SQL查询的语法是已知的,可以作为设计的一部分进行验证。
答案 1 :(得分:2)
注意:这个答案已被大大改变,以纠正一些错误信息。
以前,这个答案建议使用Convert.ToInt32(x)
。这将不直接将整数传递给数据库;但是,如果传入的值不是整数,它会很高兴地向你大喊(抛出异常)。
发生的是查询字符串向下传递给sql
(作为字符串),sql
解析器将值解释为int
基于(小sql
哥布林)。
相反,你可能应该做更像这样的事情:
public void ReadFromDatabase()
{
int idToFind;
//check that imageidTxt.Text is an integer
if (Int32.TryParse(imageidTxt.Text, out idToFind))
{
//we have an integer, so look at the database
string sql = "SELECT * FROM Table WHERE ID=" + idToFind;
//connect to/read from DB
}
else
{
//fail spectacularly
}
}
这将在您点击数据库之前添加(普通的)错误检查,并将查询作为有效语法传递。
请注意,此答案并未解决在评论/答案中提出的SQL Injection等问题,即使它目前对您没有多大意义,也是如此。非常值得学习。