必须声明标量变量或者是其他东西

时间:2014-01-29 15:21:12

标签: c# sql-server wpf visual-studio-2010 sql-server-2008

我之前问过这个问题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)来存储成像,现在我也不会为此烦恼。

2 个答案:

答案 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)来存储成像。