2009-10-09 17 views
0

Ce SELECT trouve Kelly comme prévu:En utilisant C# pour SELECT par rapport à Excel, comment est-ce que je rends le cas-INsensitive?

sélectionnez [Prénom], [Nom], Téléphone de [Data $] où [First Name] comme "% Kelly%"

Dans la feuille de calcul Excel, le premier nom est "Kelly" avec une majuscule "K" - et le SELECT spécifie aussi un "K" majuscule.

Cependant, si le K> comme "% Kelly%" < est de type LOWER-case "% kelly%" - alors l'enregistrement est introuvable. Le SELECT est sensible à la casse.

SQL Server ne semble pas avoir une méthode inférieure() ou lcase() que je peux appliquer à la colonne de base de données (??? !!!). Est-ce vrai? Un conseil généralisé sur le réseau, pour ajouter "COLLATE SQL_Latin1_General_CP1_CI_AS" à l'instruction SQL, génère l'erreur "IErrorInfo.GetDescription a échoué 0x80004005" lorsque ExecuteReader() est exécuté.

Quelqu'un peut-il suggérer un moyen de rendre mon SQL SELECT contre Excel cas-INsensitive?

J'ai collé le code ci-dessous.

(La méthode f.vs() renvoie vrai lorsqu'il est passé une chaîne valide, à savoir celui pour lequel IsEmptyOrNull() est fausse.)

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()) 
        { 

Répondre

1

[COLLATE SQL_Latin1_General_CP1_CI_AS] ne fonctionne que dans SQL Server. De ce que je peux dire à partir de votre question, vous êtes pas en utilisant SQL Server; vous utilisez une source de données OLEDB pour interroger un fichier Excel, auquel cas UCASE devrait fonctionner:

if (f.vs(firstName)) 
    select += "UCase([First Name]) like \"%" + firstName.ToUpper() + "%\" and "; 
if (f.vs(lastName)) 
    select += "UCase([Last Name]) like \"%" + lastName.ToUpper() + "%\" and "; 
+0

Cela a fonctionné, grâce muchly, Ken! Excel n'est pas SQL Server, duh! :) – hoytster

1

SQL Server dispose d'une fonction appelée LOWER qui convertit une chaîne de caractères en toutes lettres minuscules