Объявление nvarchar в VB / Соответствие nvarchar в запросе SQL - PullRequest
0 голосов
/ 22 апреля 2009

Я работаю над приложением ASP.NET, которое использует VB. Я использую SQLReader / SQLCommand / SQLConnection в файле VB, чтобы попытаться получить значения данных.

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

Я разговаривал с коллегой, и он спросил, будет ли он совпадать, потому что я передаю строку, а текстовое поле для базы данных - это nvarchar. Как я могу объявить переменную в VB, чтобы при вводе в качестве параметра для запроса она могла совпадать?

Типы данных, которым они соответствуют, это просто базовые вещи, такие как "2", "2a", "1a" и т. Д.

Если нет способа просто объявить nvarchar, есть ли у кого-нибудь предложение о том, как мне это обойти?

Спасибо большое.

Примечание: Это своего рода продолжение этого вопроса: Читатель SQL говорит, что значений не существует, запрос выглядит нормально

Редактировать: Спасибо за помощь. Я настроил все так, как вы, ребята, сказали, но теперь я получаю сообщение об ошибке: «Не существует сопоставления между типом объекта System.Data.SqlClient.SqlParameter и собственным типом известного управляемого поставщика».

У меня есть параметр как переменная всей формы:

Private travelParameter As New SqlParameter("@trip", SqlDbType.NVarChar)

А потом внутри основной формы,

travelQuery.CommandText = "SELECT [StartLoc], [EndLoc],[TravelTime], [AvgSpeed], [Distance]  FROM [TravelTimes] WHERE [TripNum] = @trip"

travelQuery.Parameters.AddWithValue("@trip", travelParameter)

Позже будет вызываться такая функция.

FillWithTime("2", travelReader, time, newCell)

Определяется как:

Private Sub FillWithTime(ByVal TripNum As Char, ByRef travelReader As SqlDataReader, ByRef TimeData() As Object, ByRef Cell As System.Web.UI.WebControls.TableCell)

    travelParameter.Value = TripNum
    travelReader = travelQuery.ExecuteReader()
    If (travelReader.Read()) Then

        travelReader.GetValues(TimeData)

        'stuff
    End If

End Sub

Еще раз спасибо.

P.S. - Адам и Серебус, я бы принял оба ответа, если бы мог. Они оба действительно собрали эту идею для меня, большое спасибо.

Ответы [ 4 ]

2 голосов
/ 22 апреля 2009

Ваш тип данных в .NET должен быть string. Вам просто нужно убедиться, что ваш экземпляр параметра использует NVarChar (если это DbParameter, то это DBType.String. Если это SqlDbParameter, то это SqlDbType.NVarChar).

2 голосов
/ 22 апреля 2009

nvarchar SqlDbType отображается на строковый тип данных .NET. Лично мне нравится создавать SqlParameters, делая их как можно более конкретными:

'This overload of the constructor takes the Parameter name, ...
' its SqlDbType and size.
Dim param as New SqlParameter("@trip", SqlDbType.NVarChar, 2)
param.Value = "1a"
travelQuery.CommandParameters.Add(param)
1 голос
/ 22 апреля 2009

Это касается только кодировки текста .net.

Узнайте, что это за кодировка, вероятно UTF8

byte [] barr = String.GetBytes (string)

System.Text.Encoding.UTF8.GetString (byte [])

0 голосов
/ 22 апреля 2009

Строка должна работать, если ее длина меньше размера поля nvarchar в базе данных.

...