将图像插入数据库时​​出错

时间:2014-01-28 12:16:10

标签: c# asp.net

我在将图像插入数据库时​​遇到错误。 下面给出的是我试图插入图像但无法正确执行的代码。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Data;

public partial class welcome : System.Web.UI.Page
{
    string fname;
    SqlConnection con = new SqlConnection();
    string emailname;

    protected void Page_Load(object sender, EventArgs e)
    {
        if ((Session["Username"] == null) && (Session["useraddress"] == null))
        {
            Response.Redirect("Registration.aspx");
        }
        else
        {
            emailname = Session["useremail"].ToString();
            Label2.Text = Session["Username"].ToString();
            Label3.Text = Session["useraddress"].ToString();
            welcomelbl.Text = Session["Username"].ToString();
            addlbl.Text = Session["useraddress"].ToString();
        }
    }

    protected void Button1_Click1(object sender, EventArgs e)
    {
        Session.Clear();
        Response.Redirect("login.aspx");
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        imageupload();
    }

我用来上传图片的功能如下。

    private void imageupload()
    {
            int imglength = FileUpload2.PostedFile.ContentLength;
            byte[] bytearray = new byte[imglength];
            fname = FileUpload2.PostedFile.FileName;
            TextBox1.Text = fname;
            HttpPostedFile image = FileUpload2.PostedFile;
            image.InputStream.Read(bytearray, 0, imglength);
            SqlConnection con = Connection.conn();
            con.Open();
            SqlCommand cmd = new SqlCommand("insert into imgtbl (imgname,img,useraddress) values(@name ,@image '" + emailname + "')", con);
            cmd.Parameters.AddWithValue("@name", SqlDbType.VarChar).Value = TextBox1.Text;
            cmd.Parameters.AddWithValue("@image", SqlDbType.Image).Value = bytearray;
            cmd.ExecuteNonQuery();
            con.Close();

    }
}

3 个答案:

答案 0 :(得分:1)

以下是错误的(您在@image和包含emailname的字符串之间缺少逗号):

SqlCommand cmd = new SqlCommand("insert into imgtbl (imgname,img,useraddress) values(@name ,@image '" + emailname + "')", con);

应该是:

SqlCommand cmd = new SqlCommand("insert into imgtbl (imgname,img,useraddress) values(@name ,@image, '" + emailname + "')", con); // Note the missing comma!

您也可以通过参数化查询来正确启动,为什么不是电子邮件地址?这是用户输入,因此参数化实际上是必须以避免SQL注入。

SqlCommand cmd = new SqlCommand("insert into imgtbl (imgname,img,useraddress) values(@name ,@image, @emailname)", con);
cmd.Parameters.AddWithValue("@name", SqlDbType.VarChar).Value = TextBox1.Text;
cmd.Parameters.AddWithValue("@image", SqlDbType.Image).Value = bytearray;
cmd.Parameters.AddWithValue("@emailname", SqlDbType.VarChar).Value = emailname;

另一件事:您希望国际用户使用您的网站吗?那么你应该真的从VARCHAR切换到NVARCHAR以允许名字中的unicode字符。

答案 1 :(得分:0)

将数据传递到SQL Server时,应始终尝试使用参数,而不是手动构建带有连接的SQL命令。

而不是:

SqlCommand cmd = new SqlCommand("insert into imgtbl (imgname,img,useraddress) values(@name ,@image '" + emailname + "')", con);

您也应该对电子邮件名称进行参数化,就像您使用@name@image一样:

string sqlCommand = "INSERT INTO imgtbl (imgname, img, useraddress) VALUES (@name, @image, @emailName)";
SqlCommand cmd = new SqlCommand(sqlCommand, con);
cmd.Parameters.AddWithValue("@name", TextBox1.Text);
cmd.Parameters.AddWithValue("@image", bytearray);
cmd.Parameters.AddWithValue("@emailname", emailname);

这样可以防止将任何格式错误的sql命令发送到数据库,但最重要的是,它会使您的调用更加安全。否则你将面临SQL注入攻击!

更新:查看@ThorstenDittmar响应,缺少的逗号可能导致语法错误

答案 2 :(得分:0)

请更正query

SqlCommand cmd = new SqlCommand("insert into imgtbl (imgname,img,useraddress) values(@name ,@image '" + emailname + "')", con);

应该是这样的

SqlCommand cmd = new SqlCommand("INSERT INTO imgtbl (imgname, img, useraddress) VALUES (@name, @image, '" + emailname + "')", con);

您在查询中错过了comma