Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用C#和SQL向数据库添加文本和图像_C#_Sql_Visual Studio_Stored Procedures_Windows Forms Designer - Fatal编程技术网

使用C#和SQL向数据库添加文本和图像

使用C#和SQL向数据库添加文本和图像,c#,sql,visual-studio,stored-procedures,windows-forms-designer,C#,Sql,Visual Studio,Stored Procedures,Windows Forms Designer,以下windows窗体应用程序接受姓名、年龄、性别、描述和图像的输入 但是,单击“保存信息”按钮时,会出现以下异常错误: System.Data.SqlClient.SqlException: " Operand type clash: nvarchar is incompatible with image" 不太清楚为什么脚本将图像解释为nvarchar数据类型 以下是该函数的存储过程 ALTER PROCEDURE [dbo].[usp_Students_Insert

以下windows窗体应用程序接受姓名、年龄、性别、描述和图像的输入

但是,单击“保存信息”按钮时,会出现以下异常错误:

System.Data.SqlClient.SqlException: " Operand type clash: nvarchar is incompatible with image"
不太清楚为什么脚本将图像解释为nvarchar数据类型

以下是该函数的存储过程

ALTER PROCEDURE [dbo].[usp_Students_InsertNewStudent]
(
    @StudentName NVARCHAR(200)
    ,@Age NVARCHAR(50)
    ,@Gender NVARCHAR(50)
    ,@Description NVARCHAR(MAX)
    ,@Image IMAGE
    ,@CreatedBy NVARCHAR(50)
)
AS
    BEGIN
        INSERT INTO [dbo].[Students]
           ([StudentName]
           ,[Age]
           ,[Gender]
           ,[Description]
           ,[Image]
           ,[CreatedBy]
           ,[CreatedDate])
     VALUES
        (
            @StudentName
            ,@Age
            ,@Gender
            ,@Description
            ,@Image
            ,@CreatedBy
            ,GETDATE()
        )

    END
及有关守则


        private void SaveButton_Click(object sender, EventArgs e)
        {
            if(IsFormValid())
            {
                //Do Update Process
                using (SqlConnection con = new SqlConnection(AppConnection.GetConnectionString())) 
                {
                    using (SqlCommand cmd = new SqlCommand("usp_Students_InsertNewStudent", con))
                    {
                        cmd.CommandType = CommandType.StoredProcedure;

                        cmd.Parameters.AddWithValue("@StudentName", StudentNameTextBox.Text.Trim());
                        cmd.Parameters.AddWithValue("@Age", AgeTextBox.Text.Trim());
                        cmd.Parameters.AddWithValue("@Gender", GenderTextBox.Text.Trim());
                        cmd.Parameters.AddWithValue("@Description", DescriptionTextBox.Text.Trim());
                        cmd.Parameters.AddWithValue("@Image", IdPictureBox.ImageLocation);
                        cmd.Parameters.AddWithValue("@CreatedBy", LoggedInUser.UserName);


                        if (con.State != ConnectionState.Open)
                            con.Open();

                        cmd.ExecuteNonQuery();

                        MessageBox.Show("Student is successfully updated in the database.", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        ResetFormControl();
                    }
                }
            }

        private bool IsFormValid()
        {
            if (StudentNameTextBox.Text.Trim() == string.Empty)
            {
                MessageBox.Show("Student name is Required.", "Validation Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                StudentNameTextBox.Focus();
                return false;
            }

            if (StudentNameTextBox.Text.Length >= 200)
            {
                MessageBox.Show("Student Name length should be less than or equal to 200 characters.", "Validation Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                StudentNameTextBox.Focus();
                return false;
            }
            return true;
        }

        private void UploadButton_Click(object sender, EventArgs e)
        {
            String ImageLocation = "";
            try
            {
                OpenFileDialog dialog = new OpenFileDialog();
                dialog.Filter = "Image Files(*.jpeg;*.bmp;*.png;*.jpg)|*.jpeg;*.bmp;*.png;*.jpg";

                if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                   ImageLocation = dialog.FileName;
                   IdPictureBox.ImageLocation = ImageLocation;
                }
            }
            catch (Exception)
            {
                MessageBox.Show("An Error Occured", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

数据库中的类型是
IMAGE
,这是一种二进制数据类型。但是,您正试图在该字段中保存图像文件的路径。图像文件的路径是文本(
VARCHAR

是否要将图像保存在数据库中,或保存对图像路径的引用?如果是前者,则数据库字段最好是
VARBINARY
,然后实际上必须将图像的字节数组保存到字段中,而不是图像的路径


如果是后者,则字段类型应为
VARCHAR
,然后您可以继续操作。

数据库中的类型为
IMAGE
,这是一种二进制数据类型。但是,您正试图在该字段中保存图像文件的路径。图像文件的路径是文本(
VARCHAR

是否要将图像保存在数据库中,或保存对图像路径的引用?如果是前者,则数据库字段最好是
VARBINARY
,然后实际上必须将图像的字节数组保存到字段中,而不是图像的路径


如果是后者,则字段类型应为
VARCHAR
,然后您可以继续操作。

您的问题是这一行:

cmd.Parameters.AddWithValue("@Image", IdPictureBox.ImageLocation);
这是图像所在位置的字符串。它正在从C#字符串转换为SQL nvarchar

您希望插入实际图像。我怀疑这可能单独起作用:

cmd.Parameters.AddWithValue("@Image", IdPictureBox.Image);
但我总是尽量避免使用
AddWithValue
,因为它可以推断类型

还有一种方法:

cmd.Parameters.Add("@Image", SqlDbType.Image).Value = IdPictureBox.Image;
注意:这明确定义了SQL类型,其中
AddWithValue
推断出它

为此,请确保指定与架构匹配的
SqlDbType

下面介绍了如何执行相同的操作,例如,使用字节数组:

var image = IdPictureBox.Image;
using (var ms = new MemoryStream())
{
    image.Save(ms, image.RawFormat);
    cmd.Parameters.Add("@Image", SqlDbType.VarBinary).Value = ms.ToArray();
}

在这两种情况下,数据类型都是使用此方法显式的。

您的问题是这一行:

cmd.Parameters.AddWithValue("@Image", IdPictureBox.ImageLocation);
这是图像所在位置的字符串。它正在从C#字符串转换为SQL nvarchar

您希望插入实际图像。我怀疑这可能单独起作用:

cmd.Parameters.AddWithValue("@Image", IdPictureBox.Image);
但我总是尽量避免使用
AddWithValue
,因为它可以推断类型

还有一种方法:

cmd.Parameters.Add("@Image", SqlDbType.Image).Value = IdPictureBox.Image;
注意:这明确定义了SQL类型,其中
AddWithValue
推断出它

为此,请确保指定与架构匹配的
SqlDbType

下面介绍了如何执行相同的操作,例如,使用字节数组:

var image = IdPictureBox.Image;
using (var ms = new MemoryStream())
{
    image.Save(ms, image.RawFormat);
    cmd.Parameters.Add("@Image", SqlDbType.VarBinary).Value = ms.ToArray();
}

在这两种情况下,数据类型都是使用此方法显式的。

不要使用
AddWithValue
(这里有大量关于为什么不使用的信息)。相反,请使用正确的类型定义参数,然后指定一个值。看看这能不能解决问题。如果有帮助的话,我可以将准确的代码作为答案发布。特别是这一行
cmd.Parameters.AddWithValue(“@Image”,IdPictureBox.ImageLocation)是您的问题。确定确切的代码是什么?已询问。。。使用字节数组而不是路径这是否回答了您的问题?不要使用
AddWithValue
(这里有大量关于为什么不使用的信息)。相反,请使用正确的类型定义参数,然后指定一个值。看看这能不能解决问题。如果有帮助的话,我可以将准确的代码作为答案发布。特别是这一行
cmd.Parameters.AddWithValue(“@Image”,IdPictureBox.ImageLocation)是您的问题。确定确切的代码是什么?已询问。。。使用字节数组而不是路径这是否回答了您的问题?