2012-03-29 8 views
7

Koddan saklı yordamına bu yolla bir veri tabanını iletiyorum. Kayıtlı yordamdaki tablo değişkenine erişilemiyor

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

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

ben saklı proc bu parametreyi erişmeye çalışıyorum.

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 

Ama çağrı saklı prosedüre yapıldığında bunun bir hata atar. Hatayı gidermek için

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. 

mümkün değil.

+0

:

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 

Bu benim veritabanına çağrıyı yapıyorum kod parçasıdır:

Bu

fonksiyonudur. com/tr-us/library/bb510489 (SQL.100) .aspx –

cevap

15

SqlCommandBuilder.DeriveParameters yöntemindeki bir hata nedeniyle, tablo değerli parametresi için SqlParameter nesnesinin TypeName özelliği, veritabanı adını içerir (bkz. http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommandbuilder.deriveparameters.aspx, "Tablo değerli parametreler doğru yazılmamış").

düzeltme bu doğru komutu oluşturduktan sonra bu genel amaçlı kod ekleyebilir: Eğer sadece bir veya iki tablo parametreleri varsa, tüm parametreler aracılığıyla döngü gerekmez

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

Güzel. Bu çalıştı. +1 –

+0

Çok hoş çok hoş. – user960567

+0

Superb .. Daha fazla zaman kazandı ... Teşekkürler .. :-) –

1

. Bunun yerine bir işlev yazdım ve bu parametreyi bu işleve aktardım, böylece yazım nesnesini düzeltirdi. Bu http://msdn.microsoft yardımcı olabilecek

'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

Güzel. Bu çalıştı. +1 –