2015-04-21 49 views
-1

我有一個問題,我真的需要你的幫助。請儘快幫助我。這是我的故事。我在Visual Studio中爲我的項目創建了一個本地數據庫。我的意思是我右鍵單擊我的項目,然後選擇添加並將服務基礎數據庫添加到我的項目中,名稱爲OCRDataBaseC#中的本地數據庫與存儲過程

我的第一個問題是這樣的:我在Visual Studio中的服務器資源管理器菜單此存儲過程對我的數據庫

CREATE PROCEDURE [dbo].[CheckDataBase] 
    @Shape int , 
    @p1 int , 
    @p2 int , 
    @p3 int , 
    @p4 int , 
    @output nvarchar(10) out 
as 
Begin 
    select 
     @output = [Character] 
    from 
     dbo.OCRTable 
    where 
     Style = @Shape 
     and Part1 = @p1 and Part2 = @p2 and Part3 = @p3 and Part4 = @p4; 

    if(@output is null) 
     select @output = '[Unknown]'; 
End 

我有6列(id, style, part1, part2, part3, part4,字符)的表。

這個存儲過程應該返回字符,如果沒有任何字符匹配存儲過程條件,它假設返回'[Unknown]';

我寫在Visual Studio此功能來獲取值這個這個存儲過程返回

static public string Check(int Shape, int p1, int p2, int p3, int p4) 
{ 
      string FunctionOutput = ""; 

      try 
      { 
       Connection.Open(); 
       SqlCommand SqlCommands = new SqlCommand("[dbo].[CheckDataBase]", Connection); 
       SqlCommands.CommandType = CommandType.StoredProcedure; 
       SqlCommands.Parameters.AddWithValue("@Shape", Shape); 
       SqlCommands.Parameters.AddWithValue("@p1", p1); 
       SqlCommands.Parameters.AddWithValue("@p2", p2); 
       SqlCommands.Parameters.AddWithValue("@p3", p3); 
       SqlCommands.Parameters.AddWithValue("@p4", p4); 

       SqlParameter OutputParameter = new SqlParameter(); 
       OutputParameter.ParameterName = "@output"; 
       OutputParameter.SqlDbType = SqlDbType.NVarChar; 
       OutputParameter.Direction = ParameterDirection.Output; 
       SqlCommands.Parameters.Add(OutputParameter); 

       SqlCommands.ExecuteNonQuery(); 
       FunctionOutput = OutputParameter.Value.ToString(); 
       MessageBox.Show(FunctionOutput); 
      } 
      catch (SqlException exception) 
      { 
       MessageBox.Show(exception.ToString()); 
      } 
      finally 
      { 
       Connection.Close(); 
      } 
      return FunctionOutput; 
} 

但當SqlCommand.ExecuteNonQuery();執行,此消息顯示出來:

類型的未處理的異常「系統.InvalidOperationException'發生在System.Data.dll中

附加信息:字符串[5]:Size屬性的無效大小爲0.

我該怎麼辦?請幫幫我。

我的第二個問題是如何給該數據庫提供相對地址,以便我可以從任何文件夾和任何計算機上運行我的應用程序。

這是我的數據庫連接:

static private SqlConnection Connection = new SqlConnection(@"Data Source=(LocalDB)\v11.0;AttachDbFilename=D:\Modem Project\PROJECT\OCR\OCR\OCRDataBase.mdf;Integrated Security=True"); 

我嘗試寫

..\..\OCRDataBase.mdf instead of D:\Modem Project\PROJECT\OCR\OCR\OCRDataBase.mdf 

但是,這是Visual Studio的消息:

已經有該名稱在數據庫中這個文件夾。

看來Visual Studio想取代它。

感謝您的幫助。

+2

你只有經過5個PARAMS VS 7你爲什麼不看再次傳遞參數 '我有5行表(id,style,part1,part2,part3,part4,Character)'如果不是這種情況你可以手動運行SQL服務器管理工​​作室和硬編碼的價值,看看它是否工作。 – MethodMan

回答

0

根據MSDN

對於具有可變長度型(nvarchar的,用於 例如)輸出參數,該參數的大小定義保持輸出參數緩衝器 的大小。輸出參數可以截斷爲 大小指定的大小。對於字符類型,Size指定的尺寸爲 的字符爲字符。

在你的情況,你想從你的存儲過程返回nvarchar,所以要儘量設置大小像這樣,

SqlParameter OutputParameter = new SqlParameter(); 
OutputParameter.ParameterName = "@output"; 
OutputParameter.SqlDbType = SqlDbType.NVarChar; 
OutputParameter.Direction = ParameterDirection.Output; 
OutputParameter.Size = 10; 
SqlCommands.Parameters.Add(OutputParameter); 
+0

很多。它完美地工作。你的超級英雄。大聲笑 。你能幫我解答第二個問題嗎?我怎麼能給我的本地數據庫相對地址,所以我可以從任何位置運行我的程序。 – Mike

+0

@Mike請在'Stackoverflow.com'中提問。我不知道相關地址。 :( –

+0

我找到了我的第二個問題答案。非常感謝你的努力。 – Mike