1

私はユーザープロファイルを作成しています。最初にユーザーが画像を選択し、このコードを使用してフォルダーにアップロードすると、アップロード後に画像が表示されます:

protected void btnUpload_Click(object sender, EventArgs e)
{
    // Initialize variables
    string sSavePath;
    string sThumbExtension;
    int intThumbWidth;
    int intThumbHeight;

    // Set constant values
    sSavePath = "images/";
    sThumbExtension = "_thumb";
    intThumbWidth = 160;
    intThumbHeight = 120;

    // If file field isn’t empty
    if (filUpload.PostedFile != null)
    {
        // Check file size (mustn’t be 0)
        HttpPostedFile myFile = filUpload.PostedFile;
        int nFileLen = myFile.ContentLength;
        if (nFileLen == 0)
        {
            lblOutput.Text = "El archivo no fue cargado.";
            return;
        }

        // Check file extension (must be JPG)
        if (System.IO.Path.GetExtension(myFile.FileName).ToLower() != ".jpg")
        {
            lblOutput.Text = "El archivo debe tener una extensión JPG";
            return;
        }

        // Read file into a data stream
        byte[] myData = new Byte[nFileLen];
        myFile.InputStream.Read(myData, 0, nFileLen);

        // Make sure a duplicate file doesn’t exist.  If it does, keep on appending an 
        // incremental numeric until it is unique
        string sFilename = System.IO.Path.GetFileName(myFile.FileName);
        int file_append = 0;
        while (System.IO.File.Exists(Server.MapPath(sSavePath + sFilename)))
        {
            file_append++;
            sFilename = System.IO.Path.GetFileNameWithoutExtension(myFile.FileName)
                             + file_append.ToString() + ".jpg";
        }

        // Save the stream to disk
        System.IO.FileStream newFile
                = new System.IO.FileStream(Server.MapPath(sSavePath + sFilename),
                                           System.IO.FileMode.Create);
        newFile.Write(myData, 0, myData.Length);
        newFile.Close();

        // Check whether the file is really a JPEG by opening it
        System.Drawing.Image.GetThumbnailImageAbort myCallBack =
                       new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback);
        Bitmap myBitmap;
        try
        {
            myBitmap = new Bitmap(Server.MapPath(sSavePath + sFilename));

            // If jpg file is a jpeg, create a thumbnail filename that is unique.
            file_append = 0;
            string sThumbFile = System.IO.Path.GetFileNameWithoutExtension(myFile.FileName)
                                                     + sThumbExtension + ".jpg";
            while (System.IO.File.Exists(Server.MapPath(sSavePath + sThumbFile)))
            {
                file_append++;
                sThumbFile = System.IO.Path.GetFileNameWithoutExtension(myFile.FileName) +
                               file_append.ToString() + sThumbExtension + ".jpg";
            }

            // Save thumbnail and output it onto the webpage
            System.Drawing.Image myThumbnail
                    = myBitmap.GetThumbnailImage(intThumbWidth,
                                                 intThumbHeight, myCallBack, IntPtr.Zero);
            myThumbnail.Save(Server.MapPath(sSavePath + sThumbFile));
            imgPicture.ImageUrl = sSavePath + sThumbFile;


            // Displaying success information
            lblOutput.Text = "El archivo fue cargado con exito!";

            // Destroy objects
            myThumbnail.Dispose();
            myBitmap.Dispose();
        }
        catch (ArgumentException errArgument)
        {
            // The file wasn't a valid jpg file
            lblOutput.Text = "No es un archivo .jpg valido";
            System.IO.File.Delete(Server.MapPath(sSavePath + sFilename));
        }
    }
}

その後、ユーザーがプロファイルの他のフィールド (名前、電子メールなど) を終了すると、保存ボタンが表示され、次のようにデータベースに保存されます。

フロントコードです

<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:pruebaConnectionString %>"
    InsertCommand="INSERT INTO Curriculum(Nombre, Correo) VALUES (@TextBox1, @TextBox2)">
    <InsertParameters>
        <asp:ControlParameter ControlID="TextBox1" DefaultValue="" Name="TextBox1" PropertyName="Text" />
        <asp:ControlParameter ControlID="TextBox2" DefaultValue="" Name="TextBox2" PropertyName="Text" />                     
    </InsertParameters>
</asp:SqlDataSource>

実際には他にもフィールドがありますが、短くするために最初の 2 つをコピーするだけです。データベースで null にできないのは nombre フィールドだけです。

コードビハインド:

protected void Button1_Click(object sender, EventArgs e)
{
                SqlDataSource1.Insert();

        String strConn = "Data Source=TOSHI;Initial Catalog=prueba;Integrated Security=True";
        SqlConnection conn = new SqlConnection(strConn);
        SqlCommand cmd = new SqlCommand();
        cmd.Connection = conn;
        string strQuery = "Insert into curriculum (imagen) values (@imgPicture)";
        cmd.CommandText = strQuery;
        cmd.CommandType = CommandType.Text;
        cmd.Parameters.AddWithValue("@imgPicture", (imgPicture.ImageUrl == null ? (object)DBNull.Value : (object)imgPicture.ImageUrl));
        conn.Open();
        cmd.ExecuteNonQuery();
        conn.Close();
}

今私がやろうとしているのは、ユーザーが保存ボタン (またはメソッド button1_click にあるもの) をクリックすると、画像の URL が varchar 50 であるフィールド Imagen のデータベースに保存されることですが、機能していません。私は得る:値NULLを列「Nombre」、テーブル「prueba.dbo.Curriculum」に挿入できません。列はヌルを許可しません。INSERT は失敗します。ステートメントは終了されました。

しかし、SqlDataSource1.Insert(); だけで button1_click メソッドを残すと、フィールドはデータベースに保存されます。

画像の URL をデータベースに保存する方法はありますか? 私の説明が明確であることを願っています!

ありがとう!:D

4

1 に答える 1

0

新しいレコードを作成しようとしていますか (すべての値を指定する必要があります)、それともレコードを更新しようとしていますか?

現時点では、コードはカリキュラム テーブルに新しいレコードを作成する INSERT を実行しようとしていますが、1 の値しか設定していません。たぶん、代わりに UPDATE を実行したいですか?

string strQuery = "UPDATE curriculum SET imagen = @imgPicture WHERE Nombre = ???";
于 2012-07-11T03:20:49.553 に答える