Команда ODBC не принимает параметр - PullRequest
1 голос
/ 20 марта 2012

Я пытаюсь вызвать сохраненный процесс на моем локальном экземпляре SQL Server (2008 R2) из ​​C # (.NET 3.5) через соединение ODBC.Проблема, с которой я сталкиваюсь, заключается в том, что хранимый процесс, похоже, не получает входной параметр.

У меня также настроен профилировщик - я не вижу никаких входных параметров, попадающих в базу данных.

Что происходит!: (

PS - Пожалуйста, не предлагайте использовать какие-либо другие технологии.


App.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <connectionStrings>
    <add name="MYDB" connectionString="Driver={SQL Server};Server=localhost;Database=MYDB;Uid=user_name;Pwd=password;"/>
  </connectionStrings>
</configuration>

Program.cs

using System;
using System.Configuration;
using System.Data;
using System.Data.Odbc;

namespace DatabaseTest
{
    class Program
    {
        static void Main(string[] args)
        {
            string mssqlConnectionString = ConfigurationManager.ConnectionStrings["MYDB"].ConnectionString;

            using (OdbcConnection connection = new OdbcConnection(mssqlConnectionString))
            {
                connection.Open();

                using (OdbcCommand command = new OdbcCommand("usp_Get_UserInfo", connection))
                {
                    command.CommandType = CommandType.StoredProcedure;
                    command.CommandTimeout = 0;
                    command.Parameters.Add(new OdbcParameter("@username", OdbcType.VarChar, 32) { Value = "Bob", IsNullable = true,  });

                    using (OdbcDataReader reader = command.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            string userName = reader["USER_NAME"].ToString();
                            string userInfo = reader["USER_INFO"].ToString();

                            Console.WriteLine(String.Format("{0} | {1}", 
                                userName, userInfo));
                        }

                        reader.Close();
                    }
                }

                connection.Close();
            }
        }
    }
}

Сохраненный процесс

USE [MYDB]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[usp_Get_UserInfo] 
    @username varchar(32) = null 
AS
BEGIN

    SET NOCOUNT ON;

    SELECT u.[USER_NAME]
        , u.USER_INFO
    FROM dbo.UserDataTable u
        WHERE u.[USER_NAME] = ISNULL(@username, u.[USER_NAME)

END

Результаты

[USER_NAME] | [USER_INFO]
Alice | Alice's info
Bob | Bob's info
Charlie | Charlie's info

1 Ответ

1 голос
/ 20 марта 2012

Нашел ответ после интенсивного поиска в Google.

Выполнение параметризованной хранимой процедуры SQL через ODBC

Кажется, что соединение odbc требует, чтобы хранимые процедуры вызывались очень интересным способом.

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

using (OdbcCommand command = new OdbcCommand("{call usp_Get_UserInfo (?)}", connection))
...