2014-01-29 27 views
0

我以前問過這個問題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; 

我不知道,如果明確參數的問題,如果是那麼如果刪除代碼,我會得到的錯誤...

變量名「@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)數據類型到圖像。這似乎解決了這個問題。我不知道如何使用varbinary(max)來存儲影像,目前我也不會爲此煩惱。

回答

2

問題是由於線路:

cmd.Parameters.Clear(); 

你加入他們後清理出的參數,你會得到同樣的錯誤參數@Name

,我真的不知道爲什麼要添加Photo參數行:

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

你可以只行註釋掉:

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

和你的代碼就足夠好了

+0

我已更新,並且出現新錯誤。你能幫助我嗎?在此先感謝 – bucketblast

+0

@bucketblast,請嘗試'cmd.Parameters.AddWithValue(「@ Photo」,DBNull.Value);' – Habib

+0

同樣的錯誤。我不應該在add參數中引用imgByteArr – bucketblast

0

解決方法是將數據類型從varbinary(max)更改爲image。這似乎解決了這個問題。我不知道如何使用varbinary(max)來存儲圖像。