我正在尝试以编程方式在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
}
}
}
}
我在这里缺少什么?或者是我不能以这种方式更改存储过程的参数?我试过在谷歌或MSDN上找到更多信息,但找不到任何解决方案......
答案 0 :(得分:0)
您是否有可能未对连接字符串中使用的用户ID的存储过程授予Alter权限?
编辑:这将是要完成的数据库端配置。
答案 1 :(得分:0)
经过多次论坛的挖掘,我找到了解决方案:设置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
}
}
}
}