需要帮助使用asp.net在sql数据库中保存图像

时间:2009-11-08 13:54:16

标签: asp.net image sql-server-2000

我试图在员工数据库中保存员工形象。我在数据库表empid,empname,empimage中有三个字段。这是我的数据库部分。

CREATE DATABASE [Employee]
GO
USE [Employee]
GO
CREATE TABLE EmpDetails
(
empid int IDENTITY NOT NULL,
empname varchar(20),
empimg image
)

在按钮点击事件中,我编写了以下代码:

SqlConnection connection = null;
    try
    {
        FileUpload img = (FileUpload)imgUpload;
        Byte[] imgByte = null;
        if (img.HasFile && img.PostedFile != null)
        {
            //To create a PostedFile
            HttpPostedFile File = imgUpload.PostedFile;
            //Create byte Array with file len
            imgByte = new Byte[File.ContentLength];
            //force the control to load data in array
            File.InputStream.Read(imgByte, 0, File.ContentLength);
        }
        // Insert the employee name and image into db
        string conn = ConfigurationManager.ConnectionStrings["EmployeeConnString"].ConnectionString;
        connection = new SqlConnection(conn);

        connection.Open();
        string sql = "INSERT INTO EmpDetails(empname,empimg) VALUES(@enm, @eimg)SELECT @@IDENTITY";
        SqlCommand cmd = new SqlCommand(sql, connection);
        cmd.Parameters.AddWithValue("@enm", txtEName.Text.Trim());
        cmd.Parameters.AddWithValue("@eimg", imgByte);
        int id = Convert.ToInt32(cmd.ExecuteScalar());
        lblResult.Text = String.Format("Employee ID is {0}", id);
    }
    catch
    {
        lblResult.Text = "There was an error";
    }
    finally
    {
        connection.Close();
    }

以下是我的表格:

<asp:Label ID="lblEmpName" runat="server" Text="Employee Name"></asp:Label>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <asp:TextBox ID="txtEName" runat="server"></asp:TextBox>
    <br />
    <asp:Label ID="lblImage" runat="server" Text="Employee Image"></asp:Label>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <asp:FileUpload ID="imgUpload" runat="server" />
    <br />
    <br />
    <asp:Button ID="btnSubmit" runat="server" Text="Submit" 
        onclick="btnSubmit_Click" />   
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp      
    <asp:Label ID="lblResult" runat="server" ForeColor="#0066FF"></asp:Label>
    <br />
    <hr />  
    <asp:Image ID="Image1" style="width:200px" Runat="server" />   

但是当我上传任何图片并点击提交按钮时会出现此错误“对象引用未设置为对象的实例”。请有人指出我的错误。

谢谢, 萨米特

3 个答案:

答案 0 :(得分:1)

对象引用错误仅在未初始化对象并尝试引用它时发生。这可以是您在代码中引用的任何对象。如果在调试时单步执行代码,则可以确切地看到哪个引用为空。

你有一个初始化imgByte对象的if语句:

  imgByte = new Byte[File.ContentLength];

如果img对象为null,则该代码不会运行。然后你在这里引用imgByte,无论img是否为null:

  cmd.Parameters.AddWithValue("@eimg", imgByte);

检查HttpPostedFile对象本身是否为null,并将您的imgByte对象初始化移到if语句之外。此外,System.IO.File对象已使用名称File。您可能希望重命名它只是为了安全。

答案 1 :(得分:0)

我会重新安排你的ADO.NET代码 - 让它安全可靠;另外,我会确保用分号分隔你的“sql”字符串中的两个SQL语句,以使SQL清楚这是两个命令,实际上:

string conn = ConfigurationManager.ConnectionStrings["EmployeeConnString"].ConnectionString;

using(connection = new SqlConnection(conn))
{
     string sqlStmt = "INSERT INTO dbo.EmpDetails(empname, empimg) " + 
                      "VALUES(@enm, @eimg); SELECT @@IDENTITY";

     using(SqlCommand cmd = new SqlCommand(sqlStmt, connection))
     {
        cmd.Parameters.AddWithValue("@enm", txtEName.Text.Trim());
        cmd.Parameters.AddWithValue("@eimg", imgByte);

        connection.Open();

        int id = Convert.ToInt32(cmd.ExecuteScalar());

        connection.Close();

        lblResult.Text = String.Format("Employee ID is {0}", id);
     }
}

这运气好吗?否则,您应该逐步调试调试器中的代码,并在代码中看到 where ,引用一些NULL(并且不检查该条件)。

马克

答案 2 :(得分:0)

  

我正在调试此代码   在此获得例外   line ...“string conn =   。ConfigurationManager.ConnectionStrings [ “EmployeeConnString”]的ConnectionString;”   例外是:未设置对象引用   到一个对象的实例。

您需要将名为EmployeeConnString的连接字符串添加到web.config。

您的异常处理程序无法区分发生异常的位置,并针对任何可能的错误发出单个错误消息。