私は開発中の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エラーの渡されたときにこのエラーが発生する可能性がありますと言って、いくつかの記事を読んで私は小数を含むすべてのデータを使用していません。どんな助けでも大歓迎です!
:
はこのような何かにそれを修正してくださいデータテーブルをロードする前にRead()を呼び出さないでください。 –
@JoelCoehoornそうですね、コマンドにパラメータを追加すると私のエラーが修正されました。あなたの提案ごとにcmd.commandtext = "select ..."の直後に追加しました。あなたの他の提案に関して、私はExecuteNonQueryをそのように呼ぶべきではないのですが、正しい方法は何ですか?また、私はdat.load(リーダー)の前にif(reader.Read())を持ってはいけないと言うので、datableをロードする前にRead()を呼び出さないように言った?どうして?あなたに質問するのではなく、ただ学びたい。答えをありがとう! – tarheels058
@ Jason - .ExecuteNonQuery()を呼び出すと実際にデータベースに行き、クエリを実行します。コードは実行中に待機します。そして、サーバーは結果を取り去り、.ExecuteReader()に到達すると、サーバーに行き、_again_クエリーを実行します。 .ExecuteNonQuery()はあなたを遅らせることを除いてここでは何もしません。また、reader.Read()呼び出しを削除する必要があります。これは、実際には最初のレコードを超えてデータ・リーダーを進めるためです。それをデータセットにロードすると、その最初のレコードがすでに読み込まれているため、ロードされます。 –