2012-01-05 11 views
2

SQL CEを使用するWindows Mobileアプリケーションを作成しています。 WHERE Barcode = @Barcodeステートメントを含めると、行が返されません。SQLServerCEはselectステートメントでrtrimを使用できません - SQLCEException

これは、Barcodeの値の後にスペースがあるためです。だから私はWHERE rtrim(Barcode) LIKE @Barcodeを使いたいです。しかし、それは私に​​"関数の指定された引数値が有効ではありません"と言っています。

私はここで何か愚かな行方不明だと確信しています。どんな助けでも大歓迎です。それはあなたの問題になることはありませんので

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 rtrim(Barcode) LIKE @Barcode"; 
       cmd.Parameters.Add(param); 

       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); 
      } 

     } 
    } 
} 

答えて

4

問題は、NTEXTまたはTEXT列をRTRIMできないことです。これは標準のSQL Serverにも適用されます。

あなたが最初NVARCHARに変換する必要があります。これで

cmd.CommandText = "SELECT Location, Reading FROM Main2 WHERE rtrim(Barcode) LIKE @Barcode"; 

(私はRTRIM削除注意):

cmd.CommandText = "SELECT Location, Reading FROM Main2 WHERE Barcode LIKE @Barcode"; 

SELECT Location, Reading FROM Main2 WHERE rtrim(CONVERT(NVARCHAR, Barcode)) LIKE @Barcode 
+0

あなたは正しいです。どうもありがとう! – tarheels058

0

SQLCEは、rtrimをサポートしています。

は、ここに私のコードです。 LIKEは本当に必要ですか? LIKE=に置き換えた場合、コードは実行されますか?

+0

なしSQLCEデータベースは、それが=では動作しないntext型として定義しているので、私はデータ型を変更ますねそれを試してみてください – tarheels058

+0

これを=に変更しても変更はありません – tarheels058

+0

ええ、バーコード列にNULL値がありますか?おそらくrtrimはNULLで動作しません。 – MusiGenesis

0

あなたはこれを交換することはできません次に:

param.Value = textBarcode.Text.Trim(); 
これで

(LIKEはそれを一致させることができるようにワイルドカードを追加):

param.Value = textBarcode.Text.Trim() + "%"; 
+0

私はこのもう一度のCONVERTオプションのパフォーマンスをテストしたいと思います。正直なところ、私は個人的にはSQLを使わないという選択肢を持っていますが、 'TableDirect'と' Seek'を使うという選択肢はありますが、*どちらの方法よりも速いでしょう。 – ctacke

関連する問題