SQLServerCE не может использовать rtrim в инструкции select — SQLCEException

Я пишу мобильное приложение Windows, которое использует SQL CE. Он не возвращает никаких строк, когда я включаю оператор WHERE Barcode = @Barcode.

Я предполагаю, что это связано с тем, что значение штрих-кода имеет пробелы после него. Поэтому я хочу использовать WHERE rtrim(Barcode) LIKE @Barcode. Но это дает мне SqlCeException сообщение: «Указанное значение аргумента для функции недопустимо».

Я уверен, что я пропускаю что-то глупое здесь. Любая помощь очень ценится.

Вот мой код:

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

        }
    }
}

person tarheels058    schedule 05.01.2012    source источник


Ответы (3)


Проблема в том, что вы не можете RTRIM столбца NTEXT или TEXT. Это также относится к стандартному SQL Server.

Сначала вы должны преобразовать его в NVARCHAR:

SELECT Location, Reading FROM Main2 WHERE rtrim(CONVERT(NVARCHAR, Barcode)) LIKE @Barcode
person competent_tech    schedule 05.01.2012

SqlCE поддерживает rtrim, так что это не должно быть вашей проблемой. Вам действительно нужно сделать LIKE здесь? Будет ли выполняться код, если заменить LIKE на =?

person MusiGenesis    schedule 05.01.2012
comment
нет, потому что в базе данных sqlce он определен как ntext, который не работает с =, я думаю, я изменю тип данных и попробую - person tarheels058; 06.01.2012
comment
изменил его на = и все равно без изменений - person tarheels058; 06.01.2012
comment
Хм, у вас есть значения NULL в столбце штрих-кода? Возможно, rtrim не работает с NULL. - person MusiGenesis; 06.01.2012

Не могли бы вы заменить это:

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

с этим (обратите внимание, я удалил rtrim):

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

а потом это:

param.Value = textBarcode.Text.Trim();

с этим (добавляя подстановочный знак, чтобы LIKE мог соответствовать ему):

param.Value = textBarcode.Text.Trim() + "%";
person ctacke    schedule 05.01.2012
comment
Я бы проверил производительность этого против опции CONVERT. Честно говоря, я понятия не имею, что быстрее (хотя лично я бы предпочел вообще не использовать SQL, а использовать TableDirect и Seek, что было бы на порядок быстрее, чем метод любой) . - person ctacke; 06.01.2012