如何解决使用 C# 和 SQL 将文本和图像添加到数据库
以下窗体应用程序接受姓名、年龄、性别、描述和图像的输入。
然而,当点击“保存信息”按钮时出现以下异常错误:
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",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.",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",MessageBoxIcon.Error);
}
}
解决方法
您的问题是这一行:
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();
}
在任何一种情况下,使用此方法的数据类型都是显式的。
,数据库中的类型为IMAGE
,为二进制数据类型。但是随后您试图将 path 保存到该字段中的图像文件。图像文件的路径是文本 (VARCHAR
)。
你是想把图片保存在数据库中,还是要引用图片的路径?如果是前者,数据库字段最好是VARBINARY
,然后你实际上必须将图像的字节数组保存到字段中,而不是图像的路径。
如果是后者,字段类型应为 VARCHAR
,然后您可以继续。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。