Я ненадолго отошел от проблемы, занялся чем-то другим и вернулся к ней.
Я решил основную проблему, переключившись с использования oledb на «что-то другое».
Я не уверен, как называется новый (для меня) метод - кроме, может быть, "native sqlserver?"
Важные моменты:
Невозможно использовать псевдоним имени поля в предложении WHERE. (согласно масиару и мату)
Исправление Конрада № 1 работало на OLEDB, но мне не нравится этот метод, потому что он многословен (а настоящая команда намного сложнее, чем уменьшенный пример, который я привожу здесь), и есть много разные вызовы. Склонен к ошибкам и труден для чтения (но работает в крайнем случае).
Чтобы получить WITH или вложенную работу select, мне пришлось переключиться с OLEDB на «собственный sqlserver» (или как там он называется). WITH (как предложено Конрадом) - мое предпочтительное решение - гораздо легче читать. Вложенный выбор (предложенный Мазиаром) также работает, когда я переключаюсь с OLEDB на нативный.
Мне нужно переключиться на «параметризованные запросы», чтобы избежать атак SQL-инъекций, как отметил Конрад.
Во всяком случае, предложения выше работают, когда я переключился на этот метод.
Вместо использования
Provider=SQLOLEDB
Я использовал:
providerName="System.Data.SqlClient"
Теперь я не делаю ссылки на oledb (например, oledbadapter), а вместо этого делаю ссылки на sqlDataAdapter. Я игнорирую верхнюю, итримовую и триммирующую функции (поскольку выясняется, что они не были проблемой) и сосредотачиваюсь на WITH, который был задушен oledb. Вот что я получил на работу:
Dim conn As New SqlConnection("server=localhost;database=DB;Integrated Security=SSPI;")
Dim sql As String
Dim da As SqlDataAdapter
Dim ds As DataSet = New DataSet()
Dim tbl As DataTable = New DataTable
conn = New SqlConnection()
conn.ConnectionString = ConfigurationManager.ConnectionStrings("DB").ConnectionString
Sql = " WITH cte AS "
sql = sql & "(lastname + firstname + middlename"
Sql = Sql & " + v) as userCompareStr FROM atable ) "
sql = sql & "SELECT userCompareStr FROM cte WHERE userCompareStr = '" & "GAPYLE1111" & "' ;"
da = New SqlDataAdapter(sql, conn)
da.Fill(ds)
tbl = ds.Tables(0)
TextBox2.Text = sql
If tbl.Rows.Count < 1 Then
TextBox1.Text = "no items"
Else
TextBox1.Text = tbl.Rows.Count & " items selected"
End If
conn.Dispose()
Также в web.config я добавил:
Я еще не добавил исправления для SQL-инъекций, но я изучаю их и теперь уверен, что это то, что мне нужно сделать. Я нашел некоторую информацию об этом здесь:
http://msdn.microsoft.com/en-us/library/ff648339.aspx
и здесь:
http://weblogs.asp.net/cibrax/archive/2006/09/28/Parameterized-Queries-_2800_Oracle_2C00_-SQLServer_2C00_-OleDb_2900_.aspx
но мне нужно время, чтобы поэкспериментировать с ним. Спасибо за помощь и указатели.