【问题标题】:Getting error on inserting image into database将图像插入数据库时​​出错
【发布时间】:2014-01-28 12:16:10
【问题描述】:

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

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();

    }
}

【问题讨论】:

  • 请格式化您的问题,指定错误消息以及您在代码中遇到错误的确切位置
  • 为什么你不使用与imgnameimg相同的方法添加useraddress
  • “我的代码有错误”不是一个足够详细的错误报告。
  • 我的错误是“xyz@gmail.com 附近的语法错误”。听到 xyz@gmail.com 是我们要插入到 imgtb 表中的 +emailname+
  • @user3230665 而且那个 syntax 错误没有导致你检查你的 SQL 语法?

标签: c# asp.net


【解决方案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 字符。

【讨论】:

  • 感谢你帮助我
  • 我想上传一张带有会话用户的图片,所以听说我们使用 emailname 作为会话值
  • 没问题 - 适当的“谢谢”是赞成和/或接受答案。
  • @user3230665 我实际上不知道你的第二条评论是什么意思,但我仍然觉得你应该使用NVARCHAR 而不是VARCHAR 和参数化查询而不是字符串连接。以防万一您试图为这两个设计决策辩护:-) 正因为您总是,总是应该使用参数化查询。没有例外,没有借口。
  • @ThorstenDittmar:为您的 NVARCHAR 观察 +1
【解决方案2】:

请指正你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

【讨论】:

    【解决方案3】:

    将数据传递到 SQL 服务器时,应始终尝试使用参数,而不是手动构建带有串联的 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 响应,缺少逗号可能导致语法错误

    【讨论】:

    • @ThorstenDittmar - 刚刚在 OP 问题中注意到了这一点;你的眼睛很好:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    • 2019-10-11
    • 1970-01-01
    • 2013-04-25
    • 2014-11-15
    • 1970-01-01
    相关资源
    最近更新 更多