我有一個正在開發的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,但我不使用含小數的任何數據可能會出現此錯誤。任何幫助是極大的讚賞!
另外:不要與SELECT查詢調用.ExecuteNonQuery(),請務必將參數設置_after_在CommandText添加到命令,並且在加載數據表之前不要調用Read()。 – 2012-01-05 18:45:24
@JoelCoehoorn好了,將參數添加到命令中可以修復我的錯誤。我按照你的建議在cmd.commandtext =「select ...」後面添加了它。至於你的其他建議,爲什麼我不應該像這樣調用ExecuteNonQuery,什麼是正確的方法?另外你說在加載datable之前不要調用Read(),所以你說我不應該在data.load(reader)之前加上if(reader.Read())?爲什麼?不要質疑你,只是想學習。感謝您的答案! – tarheels058 2012-01-05 19:13:23
@Jason - 調用.ExecuteNonQuery()將實際轉到數據庫並運行您的查詢。代碼將在運行時等待。然後服務器將把結果扔掉,當你到達.ExecuteReader()時,它會去服務器並運行查詢_again_。 .ExecuteNonQuery()在這裏沒有_nothing_,除了減慢你的速度。另外,您應該移除reader.Read()調用,因爲這實際上會使數據讀取器超過第一條記錄。然後,當您將其加載到數據集中時,該第一條記錄已被讀取,因此將被加載。 – 2012-01-05 19:36:27