Используя C # для SELECT против Excel, как мне сделать его без учета регистра? - PullRequest
0 голосов
/ 10 октября 2009

Этот SELECT находит Келли, как и ожидалось:

выберите [Имя], [Фамилия], Телефон из [Данные $], где [Имя], например, «% Kelly%»

В электронной таблице Excel имя «Kelly» с большой буквы «K», а в SELECT также указывается заглавная буква «K».

Однако, если K в> как "% Kelly%" <имеет нижний регистр - как "% kelly%" - тогда запись НЕ найдена. SELECT чувствителен к регистру. </p>

В SQL Server отсутствует метод lower () или lcase (), который я могу применить к столбцу базы данных (??? !!!). Это правда? Распространенный совет в сети, чтобы добавить «COLLATE SQL_Latin1_General_CP1_CI_AS» к инструкции SQL, выдает ошибку «IErrorInfo.GetDescription fail 0x80004005» при выполнении ExecuteReader ().

Может кто-нибудь предложить способ сделать мой SQL SELECT против Excel без учета регистра?

Я вставил код ниже.

(Метод f.vs () возвращает true, когда передан Valid String, т. Е. Для которого IsEmptyOrNull () имеет значение false.)

TIA - Hoytster

        // The user may specify the first or last names, or category, or 
        // any combination, possibly all three.
        // Build the select; [Data$] is the name of the worksheet
        string select = "select [First Name], [Last Name], Phone from [Data$] where ";
        if (f.vs(firstName))
            select += "[First Name] like \"%" + firstName + "%\" and ";
        if (f.vs(lastName))
            select += "[Last Name] like \"%" + lastName + "%\" and ";
        if (f.vs(category))
            select += "[Category] = \"" + category + "\" and ";
        select = select.Substring(0, select.Length - 4); // Lose the terminal "and "

        // This makes the SQL case-insensitive! BUT IT CAUSES ExecuteReader() FAIL
        // select += " [COLLATE SQL_Latin1_General_CP1_CI_AS]";

        // Build the connect string, using the specified Excel address file
        string connectionString =
            "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +
            @excelAddressFile +
            ";Extended Properties=Excel 8.0;";

        // Get a DB connection from an OLE DB provider factory
        DbProviderFactory factory = DbProviderFactories.GetFactory("System.Data.OleDb");
        using (DbConnection connection = factory.CreateConnection())
        {

            // Assign the connection string
            connection.ConnectionString = connectionString;

            // Create the DB command
            using (DbCommand command = connection.CreateCommand())
            {
                // Apply the select
                command.CommandText = select;

                // Retrieve the data -- THIS ExecuteReader() IS WHERE IT FAILS
                using (DbDataReader dr = command.ExecuteReader())
                {
                    while (dr.Read())
                    {

Ответы [ 2 ]

1 голос
/ 11 октября 2009

[COLLATE SQL_Latin1_General_CP1_CI_AS] работает только в SQL Server. Из того, что я могу сказать по вашему вопросу, вы не используете SQL Server; вы используете источник данных OLEDB для запроса файла Excel, в этом случае UCASE должно работать:

if (f.vs(firstName))
    select += "UCase([First Name]) like \"%" + firstName.ToUpper() + "%\" and ";
if (f.vs(lastName))
    select += "UCase([Last Name]) like \"%" + lastName.ToUpper() + "%\" and ";
1 голос
/ 10 октября 2009

SQL Server имеет функцию с именем LOWER , которая преобразует строку символов во все строчные буквы

...