2012-01-05 27 views
0

我有一個正在開發的Windows Mobile 6應用程序。這是訪問的SQL Server CE數據庫,我收到以下錯誤:C#SqlCeException - 一個參數丟失

A Parameter is missing. [Parameter ordinal = 1]

我沒有使用過的SQL Server CE太多,但使用SQL Server 2008幾乎相同的應用程序,沒有任何問題執行該代碼。我無法弄清楚爲什麼它告訴我參數丟失了!

這裏是我的代碼:

using System; 
using System.Linq; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 
using System.Data.SqlServerCe; 


namespace ElectricBarcodeApp 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 


     private void buttonStart_Click(object sender, EventArgs e) 
     { 
      System.Data.SqlServerCe.SqlCeConnection conn = new System.Data.SqlServerCe.SqlCeConnection(
      ("Data Source=" + (System.IO.Path.Combine(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase), "ElectricReading.sdf") + ";Max Database Size=2047"))); 
      try 
      { 
       // Connect to the local database 
       conn.Open(); 
       System.Data.SqlServerCe.SqlCeCommand cmd = conn.CreateCommand(); 

       SqlCeParameter param = new SqlCeParameter(); 
       param.ParameterName = "@Barcode"; 
       param.Value = textBarcode.Text.Trim(); 

       // Insert a row 
       cmd.CommandText = "SELECT Location, Reading FROM Main2 WHERE Barcode LIKE @Barcode"; 
       cmd.ExecuteNonQuery(); 

       DataTable data = new DataTable(); 

       using (SqlCeDataReader reader = cmd.ExecuteReader()) 
       { 
        if (reader.Read()) 
        { 
         data.Load(reader); 
        } 
       } 

       if (data != null) 
       { 
        this.dataGrid1.DataSource = data; 
       } 
      } 
      finally 
      { 
       conn.Close(); 
      } 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      if (ElectricReadingDataSetUtil.DesignerUtil.IsRunTime()) 
      { 
       // TODO: Delete this line of code to remove the default AutoFill for 'electricReadingDataSet.Main2'. 
       this.main2TableAdapter.Fill(this.electricReadingDataSet.Main2); 
      } 
     } 
    } 
} 

我讀過一些文章說,當一個十進制傳遞,因爲一些錯誤MSFT,但我不使用含小數的任何數據可能會出現此錯誤。任何幫助是極大的讚賞!

回答

7

您應該將參數添加到命令,應該像

cmd.Parameters.Add(param); 
+1

另外:不要與SELECT查詢調用.ExecuteNonQuery(),請務必將參數設置_after_在CommandText添加到命令,並且在加載數據表之前不要調用Read()。 – 2012-01-05 18:45:24

+0

@JoelCoehoorn好了,將參數添加到命令中可以修復我的錯誤。我按照你的建議在cmd.commandtext =「select ...」後面添加了它。至於你的其他建議,爲什麼我不應該像這樣調用ExecuteNonQuery,什麼是正確的方法?另外你說在加載datable之前不要調用Read(),所以你說我不應該在data.load(reader)之前加上if(reader.Read())?爲什麼?不要質疑你,只是想學習。感謝您的答案! – tarheels058 2012-01-05 19:13:23

+1

@Jason - 調用.ExecuteNonQuery()將實際轉到數據庫並運行您的查詢。代碼將在運行時等待。然後服務器將把結果扔掉,當你到達.ExecuteReader()時,它會去服務器並運行查詢_again_。 .ExecuteNonQuery()在這裏沒有_nothing_,除了減慢你的速度。另外,您應該移除reader.Read()調用,因爲這實際上會使數據讀取器超過第一條記錄。然後,當您將其加載到數據集中時,該第一條記錄已被讀取,因此將被加載。 – 2012-01-05 19:36:27

0

我猜(不知道你的SQL文本實際上是),你忘了您插入參數。

嘗試修改,以這樣的:

 conn.Open(); 
      System.Data.SqlServerCe.SqlCeCommand cmd = conn.CreateCommand(); 

      cmd.Parameters.AddWithValue("@Barcode", txtBarcode.Text.Trim()); 
      //SqlCeParameter param = new SqlCeParameter(); 
      //param.ParameterName = "@Barcode"; 
      //param.Value = textBarcode.Text.Trim(); 


      // Insert a row 
      cmd.CommandText = "SELECT Location, Reading FROM Main2 WHERE Barcode LIKE @Barcode"; 
      cmd.ExecuteNonQuery(); 
0
SqlCeParameter param = new SqlCeParameter();     
    param.ParameterName = "@Barcode"; 
    param.Value = textBarcode.Text.Trim(); 
    param.Add(@Barcode);