【问题标题】:SMO Stored Procedure Alter failSMO 存储过程更改失败
【发布时间】:2013-03-05 08:37:19
【问题描述】:

我正在尝试在 C# 中以编程方式更改存储过程中的参数。我遇到了 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 上查找更多信息,但找不到任何解决方案...

【问题讨论】:

  • 会发生什么?你有错误吗?如果是这样:请让我们知道究竟该错误是什么!我们既无法读取您的屏幕,也无法读取您的思想......
  • 是的,我遇到了一个错误,就像我提到的那样。改变失败。参数的数据类型不会改变。
  • 您能否给我们准确和完整的错误信息?
  • @marc_s 说没有错误消息。我所说的“错误”是数据类型没有成功改变。代码没有抛出任何异常。这就是为什么我没有给出准确完整的错误信息,没有。它让我疯了!跨度>
  • @marc_s 感谢您的评论顺便说一句。抱歉无法提供详细的错误信息。

标签: c# sql sql-server stored-procedures smo


【解决方案1】:

您是否可能没有为连接字符串中使用的用户 ID 授予存储过程的 Alter 权限?

编辑:这将是一个数据库端配置。

【讨论】:

  • 感谢您的评论。我正在使用的 uid 对存储过程具有更改权限。
【解决方案2】:

在许多论坛中挖掘之后,我找到了解决方案: 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
                        }
                    }
                }         
 }

【讨论】:

  • 您是否已将其编辑到您的 question 中,以便它现在作为一个问题没有意义,因为它包含的代码是正确的?如果是这样,不要这样做。请退出您的编辑。务必在您的 answer 中发布更正后的代码
  • @Damien_The_Unbeliever 感谢您的建议!我是论坛的新手,很抱歉这个错误。我现在就改。
  • @Damien_The_Unbeliever 我添加更正代码的方式可以吗?或者还有什么我应该添加/删除/修改的吗?谢谢~
  • 看起来不错。请记住,除了试图获得我们自己问题的答案外,我们还试图留下其他人在遇到类似问题时可以搜索的问题和答案。所以留下错误的代码实际上是有帮助的。
  • @Damien_The_Unbeliever 是的,这实际上是有道理的。感谢您向我指出。我不会再犯那个错误了:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-27
  • 2019-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多