-1

私はこのようにSQLでdbを作成しています

ImageId Int(set identity property=true)

ImageName Varchar(50)

Image image

そして私のaspxはこのように

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head runat="server">
    <title>Inserting images into databse and displaying images with gridview</title>
    <style type="text/css">
      .Gridview
      {
        font-family:Verdana;
        font-size:10pt;
        font-weight:normal;
        color:black;
        width:500px;
      }
    </style>
  </head>
  <body>
    <form id="form1" runat="server">
      <div>
        <table>
          <tr>
            <td>
              Image Name:
            </td>
            <td>
              <asp:TextBox ID="txtImageName" runat="server"></asp:TextBox>
            </td>
          </tr>
          <tr>
            <td>
              Upload Image:
            </td>
            <td>
              <asp:FileUpload ID="fileuploadImage" runat="server" />
            </td>
          </tr>
          <tr>
            <td>
            </td>
            <td>
              <asp:Button ID="btnUpload" runat="server" Text="Upload" onclick="btnUpload_Click" />
            </td>
          </tr>
        </table>
      </div>
      <div>
        <asp:GridView ID="gvImages" CssClass="Gridview" runat="server" AutoGenerateColumns="False" HeaderStyle-BackColor="#7779AF" HeaderStyle-ForeColor="white">
          <Columns>
            <asp:BoundField HeaderText = "Image Name" DataField="imagename" />
            <asp:TemplateField HeaderText="Image">
              <ItemTemplate>
                <asp:Image ID="Image1" runat="server" ImageUrl='<%# "ImageHandler.ashx?ImID="+ Eval("ImageID") %>' Height="150px" Width="150px"/>
              </ItemTemplate>
            </asp:TemplateField>
          </Columns>
        </asp:GridView>
      </div>
    </form>
  </body>
</html>

このような私のコード

string strcon = ConfigurationManager.ConnectionStrings["dbconnection"].ConnectionString;
protected void Page_Load(object sender, EventArgs e)
{
  if (!IsPostBack)
  {
    BindGridData();
  }
}
/// <summary>
/// btnUpload_Click event is used to upload images into database
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnUpload_Click(object sender, EventArgs e)
{
  //Condition to check if the file uploaded or not
  if (fileuploadImage.HasFile)
  {
    //getting length of uploaded file
    int length = fileuploadImage.PostedFile.ContentLength;
    //create a byte array to store the binary image data
    byte[] imgbyte = new byte[length];
    //store the currently selected file in memeory
    HttpPostedFile img = fileuploadImage.PostedFile;
    //set the binary data
    img.InputStream.Read(imgbyte, 0, length);
    string imagename = txtImageName.Text;
    //use the web.config to store the connection string
    SqlConnection connection = new SqlConnection(strcon);
    connection.Open();
    SqlCommand cmd = new SqlCommand("INSERT INTO Image (ImageName,Image) VALUES (@imagename,@imagedata)", connection);
    cmd.Parameters.Add("@imagename", SqlDbType.VarChar, 50).Value = imagename;
    cmd.Parameters.Add("@imagedata", SqlDbType.Image).Value = imgbyte;
    int count = cmd.ExecuteNonQuery();
    connection.Close();
    if (count == 1)
    {
      BindGridData();
      txtImageName.Text = string.Empty;
      ScriptManager.RegisterStartupScript(this, this.GetType(), "alertmessage", "javascript:alert('" + imagename + " image inserted successfully')", true);
    }
  }
}
/// <summary>
/// function is used to bind gridview
/// </summary>
private void BindGridData()
{
  SqlConnection connection = new SqlConnection(strcon);
  SqlCommand command = new SqlCommand("SELECT imagename,ImageID from [Image]", connection);
  SqlDataAdapter daimages = new SqlDataAdapter(command);
  DataTable dt = new DataTable();
  daimages.Fill(dt);
  gvImages.DataSource = dt;
  gvImages.DataBind();
  gvImages.Attributes.Add("bordercolor", "black");
}
string strcon = ConfigurationManager.AppSettings["ConnectionString"].ToString();
public void ProcessRequest(HttpContext context)
{
  string imageid = context.Request.QueryString["ImID"];
  SqlConnection connection = new SqlConnection(strcon);
  connection.Open();
  SqlCommand command = new SqlCommand("select Image from Image where ImageID=" + imageid, connection);
  SqlDataReader dr = command.ExecuteReader();
  dr.Read();
  context.Response.BinaryWrite((Byte[])dr[0]);
  connection.Close();
  context.Response.End();
}

しかし、このアプリケーションを実行すると、このエラーが表示されます

値 NULL を列 'ImageId'、テーブル 'DressDB .dbo.Image' に挿入できません。列はヌルを許可しません。INSERT は失敗します。
ステートメントは終了されました。

どうすればそれを解決できますか?

4

2 に答える 2

3

Mahmoud Gamal は正しいですが、Management Studio のデザイン ビューを使用する方が快適な場合は、次のオプションをお勧めします。

デザイナーで列を ID として設定する方法

これにより、最初に挿入された行の値が 1 に設定され、テーブルに新しい行が挿入されるたびにそのカウンターが 1 ずつ増加します。

于 2012-10-03T07:29:33.803 に答える
2

エラーはかなり明確です。この列には値が許可されていないため、NULL 値を挿入することはできませんNULL

どうすればそれを解決できますか?

ImageId次のように、この列を自動インクリメンタルにします。

ALTER TABLE Images
ALTER IMAGE_ID INT NOT NULL IDENTITY(1, 1);

次に、あなたのINSERT声明:

INSERT INTO Image (ImageName,Image) VALUES (@imagename,@imagedata)

正しく動作するはずです。

ただし、テーブルに既にデータが含まれている場合、@ Damien_The_Unbeliever で指摘されているように、直接それを行うことはできません。この場合1 :

2 つのオプションがあります。

  • ID を使用して新しいテーブルを作成し、既存のテーブルを削除します

  • ID を使用して新しい列を作成し、既存の列をドロップします

詳細については、次の質問を参照してください。


1この回答から引用

于 2012-10-03T07:08:33.320 に答える