代码之家  ›  专栏  ›  技术社区  ›  StealthRT

C#以编程方式更改存储过程

  •  0
  • StealthRT  · 技术社区  · 7 年前

    我有下面的C#代码 应该 请允许我修改(更改)我的存储过程:

    SqlConnection sqlCon = new SqlConnection(ConfigurationManager.ConnectionStrings["sqlConnection"].ConnectionString);
    ServerConnection srvCon = new ServerConnection(sqlCon);
    
    sqlCon.Open();
    
    Server srv = new Server(srvCon);
    Database db = srv.Databases[sqlCon.Database];
    StoredProcedure sp = new StoredProcedure(db, "spRDLDataFetcher");
    
    sp.TextMode = false;
    sp.AnsiNullsStatus = false;
    sp.QuotedIdentifierStatus = false;
    sp.TextBody = "SELECT blah FROM MyTable WHERE ID=1";
    sp.Alter();
    

    然而 sp.Alter() call会抛出以下错误:

    微软SqlServer。经营Smo。FailedOperationException:“StoredProcedure”dbo的Alter失败。spRDLDataFetcher''

    内部异常:InvalidSmooOperationException:无法对处于创建状态的对象执行操作Alter。

    为了让它更改(更新)该存储过程,我缺少了什么?

    1 回复  |  直到 7 年前
        1
  •  2
  •   StealthRT    7 年前

    好吧,所以我发现了为什么它没有更新。不管出于什么原因,它似乎需要 刷新; First 在我重写正文之前。

    SqlConnection sqlCon = new SqlConnection(ConfigurationManager.ConnectionStrings["sqlConnection"].ConnectionString);
    ServerConnection srvCon = new ServerConnection(sqlCon);
    
    sqlCon.Open();
    
    Server srv = new Server(srvCon);
    Database db = srv.Databases[sqlCon.Database];
    StoredProcedure sp = new StoredProcedure(db, "spRDLDataFetcher");
    
    sp.TextMode = false;
    sp.AnsiNullsStatus = false;
    sp.QuotedIdentifierStatus = true;
    sp.ImplementationType = ImplementationType.TransactSql;
    sp.Schema = "dbo";
    
    sp.Refresh(); //What was needed to make work
    string orgSPText = sp.TextBody;
    
    sp.TextBody = "SELECT blah FROM MyTable WHERE ID=1";
    sp.Recompile = true;
    sp.Alter();
    

    这个 sp.重新编译=真; 真的不需要。没有它也行,但我喜欢把它放在那里,只是为了好玩。