我正在开发ac#windows表单应用程序,它保存了关于学生的信息,如名称课程年份等。我保存到sql数据库的代码可以工作但是当涉及到retreiving信息时我得到这些错误不正确的语法附近'='。我认为错误是在retreive code.please help:)
这是检索代码:
try
{
string sql = "SELECT studnum,course,f_name,l_name,color_image FROM table3 WHERE f_name=" + textBoxfname.Text + "";
if (conn.State != ConnectionState.Open)
conn.Open();
command = new SqlCommand(sql, conn);
SqlDataReader reader = command.ExecuteReader();
reader.Read();
if (reader.HasRows)
{
labeloutputstudnum.Text = reader[0].ToString();
labeloutputcourse.Text = reader[1].ToString();
labeloutputfname.Text = reader[2].ToString();
labeloutputlname.Text = reader[3].ToString();
byte[] img = (byte[])(reader[4]);
if (img == null)
pictureBox3.Image = null;
else
{
MemoryStream ms = new MemoryStream(img);
pictureBox3.Image = Image.FromStream(ms);
}
}
else
{
textBoxstudno.Text = "";
textBoxcourse.Text = "";
textBoxfname.Text = "";
textBoxlname.Text = "";
pictureBox3.Image = null;
MessageBox.Show("does not exist");
}
conn.Close();
}
catch (Exception ex)
{
conn.Close();
MessageBox.Show(ex.Message);
}
答案 0 :(得分:5)
string sql = "SELECT studnum,course,f_name,l_name,color_image FROM table3 WHERE f_name=@Name";
command = new SqlCommand(sql, conn);
command.Parameters.Add(new SqlParameter("@Name", textBoxfname.Text));
答案 1 :(得分:1)
我看到多个错误:
不要重复使用连接,这是不好的做法,因为sql server会自动(默认情况下除非你把它关掉)使用连接池。
//不要重复使用连接,在需要时创建一个新连接! 使用(var conn = new SqlConnection(/ 使用来自web / app .config /的连接)) { const string sql =“SELECT studnum,course,f_name,l_name,color_image FROM table3 WHERE f_name = @name”;
command = new SqlCommand(sql, conn);
command.Parameters.Add(new SqlParameter("@name", SqlDbType.VarChar) { Value = textBoxfname.Text});
conn.Open();
/* rest of code unchanged but do not call conn.Close(), the using block will do this for you
}
答案 2 :(得分:-1)
因此,要回答您的问题,您的SQL查询语法不正确。我会在sql字符串上断点,看看到底是什么错。当你这样做时应该很明显。
但真正的问题是您将应用程序暴露给SQL注入。让我们看一下你所拥有的基本例子。
"SELECT * FROM table WHERE id ='" + userinput.Text + "'";
因此,用户输入一些值,然后将其转储到查询中。简单吧?
如果用户输入此内容会发生什么
' OR 1=1; --
让我们看看你的sql字符串在添加后会变成什么
SELECT * FROM table WHERE id = '' OR 1=1; -- '
所以现在,你的查询字符串说选择id OR,其中1 = 1,这意味着true,这意味着一切。
SQL注入是一个真正的威胁,阻止它的唯一方法是从一开始就实施对策。
请查看参数化。在C#中它很容易。
答案 3 :(得分:-3)
您必须在SQL中使用单引号作为字符串参数/字段:
string sql = "SELECT studnum,course,f_name,l_name,color_image FROM table3 WHERE f_name='" + textBoxfname.Text + "'";
但使用参数更好(更安全):
string sql = "SELECT studnum,course,f_name,l_name,color_image FROM table3 WHERE f_name=@name";
if (conn.State != ConnectionState.Open)
conn.Open();
var command = new SqlCommand(sql, conn);
command.Parameters.Add("@name", SqlDbType.NVarChar).Value = textBoxfname.Text;