无法访问存储过程

问题描述:

我传递一个DataTable从代码到存储过程在这样表变量。无法访问存储过程

DataTable table = CommonFunctions.ToDataTable(request); 
object[] spParams = new object[1]; 
spParams[0] = table; 

DbCommand dbCommand = 
    db.GetStoredProcCommand("OS_UpdateOrgStructureDetails", spParams); 

我想在存储过程中访问此参数。

CratePROCEDURE OS_UpdateOrgUnits 
@table OS_RenameNodeTable READONLY 
AS 
BEGIN 
    UPDATE OrgUnit 
    SET DetailName = ut.NewValue 
    FROM @table ut 
    INNER JOIN OrgUnit ou ON ou.OrgUnitID = ut.OrgUnitID 
END 

但是,当调用存储过程时,它会引发错误。

The incoming tabular data stream (TDS) remote procedure call (RPC) protocol 
stream is incorrect. Table-valued parameter 1 ("@table"), row 0, column 0: 
Data type 0xF3 (user-defined table type) has a non-zero length database name 
specified. Database name is not allowed with a table-valued parameter, only 
schema name and type name are valid. 

无法解决该错误。

+0

这可能有助于http://msdn.microsoft。 com/en-us/library/bb510489(SQL.100).aspx – 2012-03-29 07:49:45

由于SqlCommandBuilder.DeriveParameters方法中存在一个错误,表值参数的SqlParameter对象的TypeName属性包含数据库名称(请参见http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommandbuilder.deriveparameters.aspx,注释“表值参数未正确键入”)。

修复此您可以创建命令后立即添加此通用代码:

foreach (SqlParameter parameter in dbCommand.Parameters) 
{ 
    if (parameter.SqlDbType != SqlDbType.Structured) 
    { 
     continue; 
    } 
    string name = parameter.TypeName; 
    int index = name.IndexOf("."); 
    if (index == -1) 
    { 
     continue; 
    } 
    name = name.Substring(index + 1); 
    if (name.Contains(".")) 
    { 
     parameter.TypeName = name; 
    } 
} 
+1

不错。这工作。 +1 – 2013-11-09 09:45:53

+0

不错,非常好。 – user960567 2014-05-06 11:27:01

+0

非常棒..你节省了更多时间..谢谢.. :-) – 2015-03-27 10:50:03

如果你只有一个或两个表的参数,你不通过所有的参数都循环。我写了一个函数,并将该参数传递给该函数,以便修复该类型名称。

这是函数:

Private Sub SetTypeNameForTableParameter(ByRef parameter As System.Data.SqlClient.SqlParameter) 
     If parameter.SqlDbType = SqlDbType.Structured Then 
      Dim name As String = parameter.TypeName 
      Dim index As Integer = name.IndexOf(".") 
      If index <> -1 Then 
       name = name.Substring(index + 1) 
       If name.Contains(".") Then 
        parameter.TypeName = name 
       End If 
      End If 
     End If 
    End Sub 

这就是我正在做的调用数据库的代码段:

'Get Parameters in stored proc 
      Dim cmd As System.Data.Common.DbCommand = db.GetStoredProcCommand("MyStoredProc") 
      db.DiscoverParameters(cmd) 
      'The first parameter is the return value. Remove it. 
      Dim returnValueParam As Data.Common.DbParameter = cmd.Parameters(0) 
      cmd.Parameters.Remove(returnValueParam) 
      'Set type name for every table parameter 
      SetTypeNameForTableParameter(cmd.Parameters(1)) 
      'Assign values to the parameters 
      cmd.Parameters(0).Value = id 
      cmd.Parameters(1).Value = mydatatable 
      'Execute the command 
      db.ExecuteNonQuery(cmd) 
+0

不错。这工作。 +1 – 2013-11-09 09:45:05