Этот 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())
{