我之前问过这个问题here,我不确定我是否遇到了完全相同的问题,相关问题或不同的问题,但无论如何我都会问。
我收到错误
必须声明标量变量“@ID”
我有一个全局字符串变量......
string picLoc;
我有一个看起来像这样的插入方法......
cmd.CommandText = "INSERT into VolunteersMainDetails(ID , " +
"Name, Photo)" +
"VALUES(@ID, " +
"@Name, @Photo)";
cmd.Parameters.AddWithValue("@ID", txtID.Text);
cmd.Parameters.AddWithValue("@Name", txtName.Text);
FileStream fs = new FileStream(@picLoc, FileMode.Open, FileAccess.Read);
byte[] imgByteArr = new byte[fs.Length];
fs.Read(imgByteArr, 0, Convert.ToInt32(fs.Length));
fs.Close();
cmd.Parameters.Add(new SqlParameter("Photo", imgByteArr));
cmd.Parameters.Clear();
cmd.Parameters.Add("@Photo", SqlDbType.VarBinary, -1);
cmd.Parameters["@Photo"].Value = DBNull.Value;
我不确定clear参数是否是问题,如果是,那么删除该代码我会得到错误...
已声明变量名'@Photo'。变量名在查询批处理或存储过程中必须是唯一的。
如果我不使用明确的参数,我相信我已经在参数中使用了@Photo三次。
如果clear参数不是问题,那么照片代码有问题吗?或插入和值代码格式?
以下方法是打开对话框以查找图像...
private void brwsphoto_Click(object sender, RoutedEventArgs e)
{
try
{
FileDialog fldlg = new OpenFileDialog();
fldlg.InitialDirectory = Environment.SpecialFolder.MyPictures.ToString();
fldlg.Filter = "Image File (*.jpg;*.bmp;*.gif)|*.jpg;*.bmp;*.gif";
fldlg.ShowDialog();
{
picLoc = fldlg.FileName;
ImageSourceConverter isc = new ImageSourceConverter();
image1.SetValue(Image.SourceProperty,isc.ConvertFromString(picLoc));
}
fldlg = null;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message.ToString());
}
}
如果有人可以帮助我,请提前致谢?
更新1a
@Habib
我修改了插入方法,如你所建议的那样......
cmd.Parameters.Add(new SqlParameter("VPhoto", imgByteArr)); // removed this code
cmd.Parameters.Clear(); // removed this code
cmd.Parameters.Add("@Photo", SqlDbType.VarBinary, -1); // this code included
cmd.Parameters["@Photo"].Value = DBNull.Value; // this code included
所以现在我收到以下错误
不允许从数据类型nvarchar到varbinary(max)的隐式转换。使用CONVERT函数运行此查询。
解决方案
解决方案是我将数据类型从varbinary(max)更改为image。这似乎解决了这个问题。我不知道如何使用varbinary(max)来存储成像,现在我也不会为此烦恼。
答案 0 :(得分:2)
问题是由于行:
cmd.Parameters.Clear();
您在添加参数后清除参数,您将获得参数@Name
的相同错误。
我不确定您为什么要在行中添加Photo
参数:
cmd.Parameters.Add(new SqlParameter("Photo", imgByteArr));
你可以注释掉这些行:
cmd.Parameters.Add(new SqlParameter("Photo", imgByteArr));
cmd.Parameters.Clear();
并且您的代码应该足够好
答案 1 :(得分:0)
解决方案是我将数据类型从varbinary(max)更改为image。这似乎解决了这个问题。我不知道如何使用varbinary(max)来存储成像。