0

VS 2010 C# で winform アプリケーションを開発しています。これにユーザーの詳細を挿入および更新するフォームを開発しました。

私の更新ユーザーフォームは以下の画像のとおりです

![ユーザー画面の更新][1]

http://i.stack.imgur.com/iZaAJ.png

そして更新するコーディングは

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using Microsoft.VisualBasic;
using System.Drawing.Imaging;
using System.IO;

namespace SampleApplication
{
public partial class UserUpdate : Form
{
    public UserUpdate()
    {
        InitializeComponent();
    }
    SqlDataAdapter da;
    SqlConnection con = new SqlConnection("user id=sa; password=123;initial     catalog=Inventory;data source=Aniket-PC");
    SqlCommand cmd;
    MemoryStream ms;
    byte[] photo_array;
    DataSet ds;
    int rno = 0;
    string str;
    private void nameTxt_Validating(object sender, CancelEventArgs e)
    {
        if (nameTxt.Text.Trim().Length == 0)
        {
            namewarning.Visible = true;
        }
        else
        {
            namewarning.Visible = false;
        }
    }

    private void Update_Load(object sender, EventArgs e)
    {
        contTxt.MaxLength = 10;
        retriveData();
        retriveImg();
    }
    void retriveImg()
    {
        con.Open();
        cmd = new SqlCommand("Select Logo from Register where UserName='" + uNameTxt.Text + "'", con);
        da = new SqlDataAdapter(cmd);
        ds = new DataSet("MyImage");
        da.Fill(ds, "MyImage");
        DataRow myRow;
        myRow = ds.Tables["MyImage"].Rows[0];
        photo_array = (byte[])myRow["Logo"];
        ms = new MemoryStream(photo_array);
        profPic.Image = Image.FromStream(ms);
        con.Close();
    }

    void retriveData()
    {
        con.Open();
        cmd = new SqlCommand("Select * from Register where UserName='"+uNameTxt.Text+"'",con);
        SqlDataReader read = cmd.ExecuteReader();
        while (read.Read())
        {
            nameTxt.Text = (read["Name"].ToString());
            passTxt.Text = (read["Password"].ToString());
            conPassTxt.Text = (read["Password"].ToString());
            emailTxt.Text = (read["EmailId"].ToString());
            addTxt.Text = (read["Address"].ToString());
            contTxt.Text = (read["ContactNo"].ToString());
            DORTxt.Text = (read["DOR"].ToString());
            validity.Text = "Account Valid till "+(read["Validity"].ToString());
        }
        read.Close();
        con.Close();            
    }

    private void AttachBtn_Click(object sender, EventArgs e)
    {
        // Open  image by OpenFiledialog and show it in PicturBox.
        try
        {
            //filter only image format files.
            openFileDialog1.Filter = "jpeg|*.jpg|bmp|*.bmp|all files|*.*";
            DialogResult res = openFileDialog1.ShowDialog();
            if (res == DialogResult.OK)
            {
                Image img = new Bitmap(openFileDialog1.FileName);

                //inserting image in PicturBox
                profPic.Image = img.GetThumbnailImage(127, 128, null, new IntPtr());
                openFileDialog1.RestoreDirectory = true;
            }
        }
        catch
        {
            MessageBox.Show("Cannot upload image");
        }
    }
    private void UpdateBtn_Click_1(object sender, EventArgs e)
    {
        string DOM = dateTimePicker1.Value.ToShortDateString();
        if (namewarning.Visible == true || picError.Visible == true || PassError.Visible == true || emailwarningImg.Visible == true)
        {
            MessageBox.Show("Please correct the marked fields");
        }
        else
        {
            //cmd = new SqlCommand("update Register set (Name,Password,EmailId,Address,ContactNo,Logo,DOM) values('" + nameTxt.Text.Trim() + "','" + passTxt.Text.Trim() + "','" + emailTxt.Text.Trim() + "','" + addTxt.Text.Trim() + "','" + contTxt.Text.Trim() + "',@Logo,'"  + DOM+ "')", con);
            str = string.Format("update Register set Name='{0}', Password='{1}',EmailID='{2}',Address='{3}',ContactNo='{4}',Logo='{5}',DOU='{6}' where UserName='{7}'", nameTxt.Text.Trim(), passTxt.Text.Trim(), emailTxt.Text.Trim(),addTxt.Text.Trim(), contTxt.Text.Trim(), @"Logo" ,DOM,uNameTxt.Text);
            con_photo();
            //con.Open();
            cmd = new SqlCommand(str, con);
            int count= cmd.ExecuteNonQuery();
            if (count > 0)
                MessageBox.Show("Sucsess");
            else
                MessageBox.Show("need to work");
        }
    }
    void con_photo()
    {
        if (profPic.Image != null)
        {
            ms = new MemoryStream();
            profPic.Image.Save(ms, ImageFormat.Jpeg);
            byte[] photo_array = new byte[ms.Length];
            ms.Position = 0;
            ms.Read(photo_array, 0, photo_array.Length);
            cmd.Parameters.AddWithValue("@Logo", photo_array);
        }
    }

アプリケーションを実行すると、非常にうまく実行され、成功メッセージが表示されますが、更新ユーザーフォームを再度表示しようとすると、スクリーンショットエラーの下に表示されます

http://i.stack.imgur.com/7z1Rx.png

取得時 ()

この解決策を教えてください..

4

3 に答える 3

0

画像バイトをUPDATEコマンドに渡すのではなく、単語を含む文字列を渡しますLogo

また、文字列連結または を使用して SQL コマンドを作成しないでくださいString.Format。代わりにパラメーター化されたクエリを使用してください。


またNVARCHAR、画像バイトを格納するためにフィールドを使用しないでください (最初にそれらから BASE64 文字列を作成しない限り)、代わりにVARBINARYまたは列を使用してください。IMAGE


問題は次の行にあります。

str = string.Format("update Register set ... ,Logo='{5}' ...", ..., @"Logo", ...);

ご覧のとおり、文字列をフォーマットしていますが、画像からバイトを挿入するのではなく、「ロゴ」という単語を挿入しています。

Logo列のタイプがIMAGEorであると仮定すると、次のVARBINARYように記述します。

byte[] photo_array = null;

if (profPic.Image != null)
{
    MemoryStream ms = new MemoryStream();
    profPic.Image.Save(ms, ImageFormat.Jpeg);

    photo_array = ms.GetBuffer();
}

if (photo_array != null)
{
    SqlCommand cmd = new SqlCommand("UPDATE Register SET Logo=@logo", connection);
    cmd.Parameters.AddWithValue("@logo", imageBytes);
    cmd.ExecuteNonQuery();
}
于 2013-10-17T11:01:14.977 に答える
0

間違っているかもしれませんがやってみます

photo_array = (byte[])myRow["Logo"];
if photo_array.length.trim()>0
{
    ms = new MemoryStream(photo_array);  
    profPic.Image = Image.FromStream(ms);

}
con.Close();

このエラーは、文字列の長さが 0 の場合に発生する可能性があります

もう1つのことは、画像をデータベースに保存していないことです

于 2013-10-17T11:03:38.277 に答える
-1

//C# コード

SqlCommand cmdSelect = new SqlCommand("ID=1 のテーブルから ImageValue を選択", ObjCon); ObjCon.Open();

        byte[] barrImg = (byte[])cmdSelect.ExecuteScalar();
        ObjCon.Close();
         string strfn = Convert.ToString(DateTime.Now.ToFileTime());
        FileStream fs = new FileStream("C:\\Temp\\1.txt", FileMode.CreateNew, FileAccess.Write);
        fs.Write(barrImg, 0, barrImg.Length);
        fs.Flush();
        fs.Close();

// 1.txt ファイルが c:\temp フォルダーに作成されます

于 2015-02-27T15:51:08.763 に答える