C# 必须声明标量变量还是其他变量

C# 必须声明标量变量还是其他变量,c#,sql-server,wpf,visual-studio-2010,sql-server-2008,C#,Sql Server,Wpf,Visual Studio 2010,Sql Server 2008,我以前问过这个问题,我不确定我是否有完全相同的问题,相关的问题或不同的问题,但我还是会问 我犯了一个错误 必须声明标量变量“@ID” 我有一个全局字符串变量 string picLoc; 我有一个insert方法,看起来像这样 cmd.CommandText = "INSERT into VolunteersMainDetails(ID , " + "Name, Photo)" + "VALUES(@ID, " +

我以前问过这个问题,我不确定我是否有完全相同的问题,相关的问题或不同的问题,但我还是会问

我犯了一个错误

必须声明标量变量“@ID”

我有一个全局字符串变量

string picLoc;
我有一个insert方法,看起来像这样

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;
我不知道如果清除参数是问题,如果它是那么如果删除该代码,我将得到错误的

变量名'@Photo'已声明。变量名在查询批处理或存储过程中必须是唯一的

如果我没有使用清晰的参数,我相信我已经在参数中使用@Photo三次了

如果clear参数不是问题,那么photo代码是否有问题?还是插入和值代码格式

下面的方法是打开对话框查找图像

 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

@哈比卜

我已经按照您的建议修改了插入方法

         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)来存储图像,目前我也不担心它

问题是由于线路:

cmd.Parameters.Clear();
添加参数后,您将清除这些参数,对于参数
@Name
,您将得到相同的错误

我不太清楚为什么要在行中添加
Photo
参数:

cmd.Parameters.Add(new SqlParameter("Photo", imgByteArr));
您只需注释掉以下行:

cmd.Parameters.Add(new SqlParameter("Photo", imgByteArr));
cmd.Parameters.Clear();

您的代码应该足够好了

解决方案是将数据类型从varbinary(max)更改为image。这似乎解决了问题。我不知道如何使用varbinary(max)来存储图像

我已更新,并收到一个新错误。你也能帮我吗?谢谢你advance@bucketblast,尝试使用cmd.Parameters.AddWithValue(“@Photo”,DBNull.Value)相同的错误。我不应该在add参数中引用imgByteArr