Проблема с SqlServerCe с параметризованными запросами из .NET

StackOverflow https://stackoverflow.com/questions/1836016

Вопрос

Я вырываю волосы из своей головы, пытаясь разобраться в этом деле.

Я не могу заставить параметризованные запросы работать в VB.Net, когда я использую параметры.

Из того, что я нашел, используя параметр в функции, из .NET выдает ошибку (см. Пример кода).Однако выполнение нерабочего запроса в окне запроса в Visual Studio работает должным образом.

Возникшая ошибка такова:

25922 - Аргументы для функции недопустимы.

Информация от:http://msdn.microsoft.com/en-us/library/aa256772%28SQL.80%29.aspx

Пример кода:

Imports System.Data.SqlServerCe

Public Class MiniDemo

    Public Shared Sub Main()
        Dim cs As String = "Data Source=Inventory.sdf; Persist Security Info=False;"
        Dim db As New SqlCeConnection(cs)
        db.Open()


        ''#Using parameters works
        Dim cmd As SqlCeCommand = db.CreateCommand()

        cmd.CommandText = "INSERT INTO inventory_type (inv_type_id, inv_type_name) VALUES (@id, @name)"
        cmd.Parameters.Add("@id", 1)
        cmd.Parameters.Add("@name", "test")
        cmd.ExecuteNonQuery()



        ''#Using parameters in functions does not work
        Dim cmd2 As SqlCeCommand = db.CreateCommand()

            ''#Broken on multiple lines for readability (built using string builders in real code)
        cmd2.CommandText = 
                     "SELECT 
                        inv_type_id, 
                        inv_type_name 
                      FROM
                        inventory_type 
                      WHERE 
                        ((@id IS NULL) OR (inv_type_id = @id)) AND 
                        ((@name IS NULL) OR (inv_type_name = @name))"

        cmd2.Parameters.Add("@id", 1)
        cmd2.Parameters.Add("@name", "test") ''# Would not work with DBNull.Value either

        Dim da2 As New SqlCeDataAdapter(cmd2)
        Dim dt2 As New DataTable()
        da2.Fill(dt2)
        db.Close()
    End Sub

End Class
Это было полезно?

Решение

Наконец-то я нашел решение этой проблемы.

Использование параметра в функции приводит к сбою, если свойство DbType параметра не задано:

Это приведет к сбою:

    Dim cmd As SqlCeCommand = db.CreateCommand()

    cmd.CommandText = "SELECT COALESCE(@param1, @param2);"
    cmd.Parameters.Add("@param1", 1)
    cmd.Parameters.Add("@param2", "test")
    cmd.ExecuteScalar()

Использование параметра в функции будет работать, если свойство DbType параметра является установленный

Это сработает:

    Dim cmd As SqlCeCommand = db.CreateCommand()

    cmd.CommandText = "SELECT COALESCE(@param1, @param2);"
    cmd.Parameters.Add("@param1", 1).DbType = DbType.Int32
    cmd.Parameters.Add("@param2", "test").DbType = DbType.String
    cmd.ExecuteScalar()
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top