2013-03-05 45 views
0

我想在c#中以編程方式更改存儲過程中的參數。我遇到了SMO,並一直試圖使用它,但改變仍然失敗。這裏是我的代碼:SMO存儲過程變更失敗

//alter parameter data type in stored procedure if parameter is not varchar 
public static void AlterSPParamInfo (string SPName,string parameterName,string connectionStringName) 
{ 
    SqlConnection vSqlConnection = CreateSqlConnectionStr(connectionStringName); 
    using(vSqlConnection) 
     { 
      ServerConnection vConnection = new ServerConnection(vSqlConnection); 
      Server vServer = new Server(vConnection); 
      Database vDatabase = vServer.Databases["HrSys"]; 
      var vTables = vDatabase.Tables; 
      StoredProcedure sp = vDatabase.StoredProcedures[SPName]; 
      if(sp != null) 
      { 
       StoredProcedureParameter spParameter = sp.Parameters[parameterName]; 
       if(spParameter!=null) 
       { 
        if(!spParameter.DataType.Equals(DataType.VarChar(50))) 
        { 
         spParameter.DataType = DataType.VarChar(50); 
         sp.QuotedIdentifierStatus = true; 
         try 
         { 
          sp.Refresh(); 
          sp.Alter(); 
         } 
         catch(SqlServerManagementException ex) 
         { 
          //other code 
         } 
        } 
       }   
} 

我在這裏錯過了什麼?還是我不能以這種方式更改存儲過程的參數?我曾嘗試在Google或MSDN上找到更多信息,但無法找到任何解決方案...

+0

會發生什麼情況?你有錯誤嗎?如果是這樣:請讓我們知道什麼**完全**錯誤是!我們不能讀取您的屏幕,也不能讀取您的想法.... – 2013-03-05 09:56:38

+0

是的,我收到了一個錯誤,就像我剛纔提到的那樣。更改失敗。參數的數據類型不會更改。 – coffeeak 2013-03-05 09:58:23

+0

您可以**請**給我們**確切和完整的**錯誤信息? – 2013-03-05 10:29:07

回答

0

您是否有可能未在連接字符串中使用的用戶標識授予存儲過程的更改權限?

編輯:這將是一個數據庫端配置要完成。

+0

感謝您的評論。我正在使用的uid對存儲過程有更改權限。 – coffeeak 2013-03-05 10:08:40

0

經過很多論壇的挖掘,我發現解決方案:Set sp.TextMode = false; 然後成功執行alter過程。 StoredProcedure.TextMode Property

//alter parameter data type in stored procedure if parameter is not varchar 
public static void AlterSPParamInfo (string SPName,string parameterName,string connectionStringName) 
{ 
    SqlConnection vSqlConnection = CreateSqlConnectionStr(connectionStringName); 
    using(vSqlConnection) 
     { 
      ServerConnection vConnection = new ServerConnection(vSqlConnection); 
      Server vServer = new Server(vConnection); 
      Database vDatabase = vServer.Databases["HrSys"]; 
      var vTables = vDatabase.Tables; 
      StoredProcedure sp = vDatabase.StoredProcedures[SPName]; 
      if(sp != null) 
      { 
       StoredProcedureParameter spParameter = sp.Parameters[parameterName]; 
       if(spParameter!=null) 
       { 
        if(!spParameter.DataType.Equals(DataType.VarChar(50))) 
        { 
         spParameter.DataType = DataType.VarChar(50); 
         sp.QuotedIdentifierStatus = true; 
         try 
         { 
          sp.TextMode = false; 
          sp.Alter(); 
         } 
         catch(SqlServerManagementException ex) 
         { 
          //other code 
         } 
        } 
       }   
} 
+0

您是否已將它編輯到您的*問題*中,以便它現在可以*沒有意義*作爲一個問題,因爲它包含的代碼是正確的?如果是這樣,**請**不這樣做。請退出您的編輯。通過一切手段發佈在您的答案*更正的代碼* – 2013-03-06 07:49:57

+0

@Damien_The_Unbeliever謝謝對於建議!我是新的論壇,所以很抱歉的錯誤,我現在會改變它。 – coffeeak 2013-03-06 07:58:35

+0

@Damien_The_Unbeliever它是否正確的方式,我添加了更正的代碼?或者有什麼我shoudl添加/刪除/修改? 〜 – coffeeak 2013-03-06 08:02:25