2009-08-12 69 views
0

我創建了一個存儲過程dbo.test如下什麼是錯在我的代碼來調用存儲過程

use sample 
    go 
    create procedure dbo.test as 

    DECLARE @command as varchar(1000), @i int 
    SET @i = 0 
    WHILE @i < 5 
    BEGIN 
     Print 'I VALUE ' +CONVERT(varchar(20),@i) 
    SET @i = @i + 1 
    END 

現在我創建一個C#控制檯應用程序來調用存儲過程如下

using System; 
    using System.Collections.Generic; 
    using System.Text; 
    using System.Data; 
    using System.Data.SqlClient; 
    namespace AutomationApp 
    { 
    class Program 
    { 
     public void RunStoredProc() 
    { 
    SqlConnection conn = null; 
    SqlDataReader rdr = null; 



    try 
    { 

    conn = new SqlConnection("Server=(TEST\\SQL2K5EXPRESS);DataBase=sample,IntegratedSecurity=SSPI"); 
    conn.Open(); 
    SqlCommand cmd = new SqlCommand("sample.dbo.test", conn); 
    cmd.CommandType = CommandType.StoredProcedure; 
     //cmd.ExecuteNonQuery(); 
    rdr = cmd.ExecuteReader(); 
    while (rdr.Read()) 
     { 
      Console.WriteLine(String.Format("{0}, {1}", 
       rdr[0], rdr[1])); 
     } 
     } 
      catch(Exception ex) 
     { 
      Console.writeLine(ex.message); 
     }  
    finally 
    { 
     if (conn != null) 
     { 
      conn.Close(); 
     } 
     if (rdr != null) 
     { 
      rdr.Close(); 
     } 
    } 
    } 
    static void Main(string[] args) 
    { 
     Console.WriteLine("Hello World"); 

     Program p= new Program(); 
     p.RunStoredProc();  
     Console.Read(); 
    } 

} 

}

O/P: 
    Hello World 
    //Could not find stored procedure 'test'. 
    A network-related or instance-specific error occurred while establishing a conne 

ction到SQL Server。服務器未找到或無法訪問。驗證 實例名稱是否正確,並且SQL Server已配置爲允許遠程連接 。 (提供者:SQL網絡接口,錯誤:26 - 錯誤定位即成 R /例如指定)

但是,當我嘗試運行,將關閉以便程序我調試的程序,然後在正好在的ExecuteReader()方法,它是顯示無法找到存儲過程「dbo.test」 當我在SSMS上給出「EXEC dbo.test」時,它顯示結果如我所料。

與這個任何幫助whngt大受讚賞。

+0

@command是否爲空? – VVS 2009-08-12 10:36:27

+0

當您在另一個數據庫中創建過程並更改連接字符串以連接到該數據庫並執行該過程時會發生什麼? – Kirtan 2009-08-12 10:36:47

+1

另請檢查已創建過程的數據庫服務器實例。它是真的(本地)還是(本地\ SQLExpress)或其他什麼? – Kirtan 2009-08-12 10:38:32

回答

0

您是否嘗試過使用「test」而不是「dbo.test」?

+0

是的,它也是同樣的問題。 – Cute 2009-08-12 10:34:03

+0

看看羅素的回答。 – 2009-08-12 10:35:59

1

我會建議它與授予存儲過程的權限相關。 查看「授予執行<storedProc>到<用戶>」您也可以通過右鍵單擊存儲的過程來檢查SSMS中的權限。

我知道這是一個測試存儲過程,但在master數據庫中創建存儲過程並不是最佳選擇。

一切順利:)

2

你爲什麼在master數據庫中查找?

而且,你的代碼需要一些清理:

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Data; 
using System.Data.SqlClient; 
namespace AutomationApp 
{ 
    class Program 
    { 
     public void RunStoredProc() 
     { 
      Console.WriteLine("\nTop 10 Most Expensive Products:\n"); 

      using (SqlConnection conn = 
       new SqlConnection(
        "Server=(local);DataBase=master;IntegratedSecurity=SSPI")) 
      { 
       conn.Open(); 
       using (SqlCommand cmd = 
         new SqlCommand("dbo.test", conn) { 
          CommandType = CommandType.StoredProcedure}) 
       { 
        using (SqlDataReader rdr = cmd.ExecuteReader()) 
        { 
         while (rdr.Read()) 
         { 
          Console.WriteLine(String.Format("{0}, {1}", 
                  rdr[0], rdr[1])); 
         } 
        } 
       } 
      } 
     } 
    } 
} 
1

只要改變你的連接字符串:

conn = new SqlConnection("Server=(local);DataBase=master;IntegratedSecurity=SSPI"); 

你打的master數據庫。你想打任何你的數據庫被調用。

或者,將存儲的過程稱爲dbname.dbo.test

0

您的存儲過程不會返回任何結果。將您的PRINT更改爲SELECT。 您可能會遇到錯誤,因爲ADO.NET不知道如何對打印語句導致的狀態消息做出反應。

+0

ADO.NET只是執行存儲過程,我有Supplied.in存儲過程我只是打印我的價值....我想這裏ut是連接問題第一個連接不建立到sqlserver – Cute 2009-08-12 12:13:38

+0

如果你只是執行存儲proc並不返回任何內容,請使用** .executeNonQuery()**而不是ExecuteReader()! – 2009-08-12 14:04:42

+0

連接已打開。如果連接失敗,連接失敗。打開ExecuteReader()。 你有沒有試過我的建議? – pipTheGeek 2009-08-12 20:42:14

1

首先 - 連接字符串中存在拼寫錯誤 - 您需要使用全部分號 - 不是分號一次,逗號是其他時間。在DAtaBase =和IntegratedSEcurity之間,你有一個逗號 - 另外,它必須是「集成安全性」(有一個空間!)。查看www.connectionstrings.com瞭解如何正確創建連接字符串的詳細信息。在您的文章

您的原始連接字符串:

conn = new SqlConnection(
    "Server=(TEST\\SQL2K5EXPRESS);DataBase=sample,IntegratedSecurity=SSPI"); 

真的應該是:

conn = new SqlConnection(
    "Server=(TEST\\SQL2K5EXPRESS);DataBase=sample;Integrated Security=SSPI"); 

一旦將工作,我認爲主要的問題是,你想在傳遞參數@command中的SQL語句添加到在存儲過程中執行的存儲過程(不是在您當前的文章中,而是在您發佈的其他文章中),並且您想讀出該語句返回的行。

但是,您無法確定(即將解析所傳遞的SQL語句),無論該SQL語句實際上是否確實會返回值,或者它是否是像INSERT,CREATE TABLE之類的DDL語句。

所以,你必須ADO.NET,調用存儲過程,其動態執行任意的SQL語句,你仍然希望能夠檢索這些結果....

在我看來,你需要重新構建你的方法 - 這將無法可靠地工作 - 找到另一種方法來做你正在做的事情 - 必須有一種方法來執行此操作,在存儲過程中執行SQL的動態執行較少,而且......有一個更簡單的方法!

馬克

+0

這指出了問題,答案和周圍的材料。做得好。 – Beska 2009-08-12 21:22:00

0

您所看到的SQL錯誤連接到服務器。它甚至沒有那麼遠,所以它根本與權限無關。就您的客戶而言,如果連接到「Server = GroverCleveland \ Instance1」(假設您的網絡中不存在),則會出現同樣的錯誤。

我認爲問題在於你正在將服務器名稱包裝在parens中,如果你可以在同一個客戶端上使用其他SQL客戶端進行連接。嘗試以下操作:

conn = new SqlConnection("Server=TEST\\SQL2K5EXPRESS;DataBase=sample;IntegratedSecurity=SSPI"); 

馬克是正確的分號,順便說一句。請查看connectionstrings.com以瞭解有關詳細信息...