2012-03-20 5 views
1

Я пытаюсь вызвать хранимую процедуру на моем локальном экземпляре SQL Server (2008 R2) из ​​C# (.NET 3.5) через ODBC-соединение. Проблема, с которой я сталкиваюсь, заключается в том, что хранимый процесс, похоже, не получает входной параметр.Команда 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 
+0

Вы хотите удалить '.Open()' и '.Close()' s, которые у вас есть, 'using' будет обрабатывать открытие и закрытие. – CAbbott

+0

@CAbbott Да, отлично. Это была проблема. Он работает сейчас ... –

+0

Извините, я забыл закрыть блок сарказма. Виноват. –

ответ

1

Найден ответ после некоторой интенсивной Googling.

Execute Parameterized SQL StoredProcedure via ODBC

кажется, что соединение ODBC требует хранимых процедур будет называться в очень интересной форме.

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

Смежные вопросы