2012-01-05 24 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

あなたは私はあなたがあなたのパラメータを挿入するのを忘れていること(あなたのSQLテキストが実際に何であるかを知らずに)推測している

cmd.Parameters.Add(param); 
+1

はこのような何かにそれを修正してくださいデータテーブルをロードする前にRead()を呼び出さないでください。 –

+0

@JoelCoehoornそうですね、コマンドにパラメータを追加すると私のエラーが修正されました。あなたの提案ごとにcmd.commandtext = "select ..."の直後に追加しました。あなたの他の提案に関して、私はExecuteNonQueryをそのように呼ぶべきではないのですが、正しい方法は何ですか?また、私はdat.load(リーダー)の前にif(reader.Read())を持ってはいけないと言うので、datableをロードする前にRead()を呼び出さないように言った?どうして?あなたに質問するのではなく、ただ学びたい。答えをありがとう! – tarheels058

+1

@ Jason - .ExecuteNonQuery()を呼び出すと実際にデータベースに行き、クエリを実行します。コードは実行中に待機します。そして、サーバーは結果を取り去り、.ExecuteReader()に到達すると、サーバーに行き、_again_クエリーを実行します。 .ExecuteNonQuery()はあなたを遅らせることを除いてここでは何もしません。また、reader.Read()呼び出しを削除する必要があります。これは、実際には最初のレコードを超えてデータ・リーダーを進めるためです。それをデータセットにロードすると、その最初のレコードがすでに読み込まれているため、ロードされます。 –

0

のようなものである必要があり、コマンドにパラメータを追加する必要があります。 、CommandTextを設定_after_コマンドにパラメータを追加することを確認し、そのSELECTクエリで.ExecuteNonQuery()を呼び出すことはありません。また

 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); 
関連する問題