Возникает ошибка при вставке таблицы в базу данных?

я вставляю таблицу в базу данных, используя тип данных таблицы со следующим кодом:

CREATE TYPE BackUpDoctorLocationAreaRoom AS TABLE (
[RoomId] bigint,
[AreaId] bigint,
[LocationId] bigint
);

Alter proc proc_tblBackUpDoctorInsert 
(
@Id uniqueidentifier='',
@BackUpDoctorId uniqueidentifier='1323e1f4-7a93-4b45-9a9b-3840c32fd6d8',  
@StartDate datetime='11/08/2012',  
@EndDate datetime='11/09/2012',  
@StartTime datetime='22:22:22',  
@EndTime datetime='01:11:11',  
@CreatedBy uniqueidentifier='acf7961c-4111-49ad-a66a-ce7f9ce131bd',  
@ModifiedBy uniqueidentifier='acf7961c-4111-49ad-a66a-ce7f9ce131bd',  
@createdDate datetime='11/6/12 3:09:58 AM',  
@ModifiedDate datetime='11/6/12 3:09:58 AM',
@tblBackUpDoctorsForRooms BackUpDoctorLocationAreaRoom READONLY
)    
as    
set xact_abort on
declare @newId uniqueidentifier;    
set @newId = newid(); 
insert into tblBackUpDoctor (Id,BackUpDoctorId,StartDate,EndDate,StartTime,EndTime,CreatedBy,ModifiedBy,
createdDate,ModifiedDate,IsActive,isdeleted) values 
(@newId,    
@BackUpDoctorId,    
@StartDate,    
@EndDate,    
@StartTime,    
@EndTime,    
@CreatedBy,    
@ModifiedBy,    
@createdDate,    
@ModifiedDate,    
1,0)    
declare @IdFortblBackUpDoctorsForRooms uniqueidentifier;    
set @IdFortblBackUpDoctorsForRooms = newid();    
delete from tblBackUpDoctorsForRooms where BackUpRecordId=@id and Roomid in (Select roomid from @tblBackUpDoctorsForRooms)
delete from tblbackupdoctor where id=@id
insert into tblBackUpDoctorsForRooms (BackUpRecordId,Roomid,Araeid,locationid)    
Select  @newId,roomid,areaid,locationid from @tblBackUpDoctorsForRooms
select @newId

Это sp, в котором я использую эту таблицу.

Код моего файла класса:

public string InsertBackUpDoctor(ClsBackUpDoctorProp objProp, DataTable dtLocAreaRoom)
{
    String ConnectionString = CCMMUtility.GetCacheForWholeApplication();
    String backUpRecordId = "";
    SqlParameter[] param = new SqlParameter[12];
    param[0] = new SqlParameter("@Id", objProp.Id);
    param[1] = new SqlParameter("@BackUpDoctorId", objProp.BackUpDoctorId);
    param[2] = new SqlParameter("@StartDate", objProp.StartDate);
    param[3] = new SqlParameter("@EndDate", objProp.EndDate);
    param[4] = new SqlParameter("@StartTime", objProp.StartTime);
    param[5] = new SqlParameter("@EndTime", objProp.EndTime);
    param[6] = new SqlParameter("@CreatedBy", objProp.CreatedBy);
    param[7] = new SqlParameter("@ModifiedBy", objProp.ModifiedBy);
    param[8] = new SqlParameter("@createdDate", CCMMUtility.GetCurrentDateTimeByTimeZone("US Mountain Standard Time"));
    param[9] = new SqlParameter("@ModifiedDate", CCMMUtility.GetCurrentDateTimeByTimeZone("US Mountain Standard Time"));
    param[10] = new SqlParameter("@CurrentDate", objProp.CurrentDate);
    param[11] = new SqlParameter("@tblBackUpDoctorsForRooms ", dtLocAreaRoom);


    backUpRecordId = SqlHelper.ExecuteScalar(ConnectionString, "proc_tblbackupdoctorInsertBackUpDoctors", param).ToString();
    return backUpRecordId;
}

и вот ошибка, которая появляется, когда я пытаюсь вставить:

Неверный поток протокола удаленного вызова процедур (RPC) входящего потока табличных данных (TDS). Табличный параметр 12 ("@tblBackUpDoctorsForRooms"), строка 0, столбец 0: тип данных 0xF3 (определяемый пользователем тип таблицы) имеет указанное имя базы данных ненулевой длины. Имя базы данных не разрешено с параметром, возвращающим табличное значение, допустимы только имя схемы и имя типа. Я не знаю, почему это происходит, пожалуйста, помогите мне..


person Ram Singh    schedule 06.11.2012    source источник
comment
@ViralShah это для nvarchar, и я не прошу об этом, я использую datatable вместо этого ..   -  person Ram Singh    schedule 06.11.2012


Ответы (2)


Я считаю, что вам придется изменить способ передачи вашего пользовательского параметра:

Не просто

param[11] = new SqlParameter("@tblBackUpDoctorsForRooms ", dtLocAreaRoom);

а скорее что-то вроде

SqlParameter parameter = new SqlParameter();           

parameter.ParameterName = "@tblBackUpDoctorsForRooms";               
parameter.SqlDbType = System.Data.SqlDbType.Structured;
parameter.TypeName = "BackUpDoctorLocationAreaRoom";                
parameter.Value = dtLocAreaRoom;                                  

param[11] = parameter;       
person Wiktor Zychla    schedule 06.11.2012

пытаться

parameter.SqlDbType = System.Data.SqlDbType.Structured;
parameter.TypeName = "BackUpDoctorLocationAreaRoom"; 

и в звонилку добавить

backUpRecordId = SqlHelper.ExecuteScalar(ConnectionString,CommandType.StoredProcedure   
"proc_tblbackupdoctorInsertBackUpDoctors", param).ToString();
person Anshuman Jasrotia    schedule 07.11.2012
comment
но если не указать тип команды, я думаю, что по умолчанию используется Stored proc .. не так ли??????????? - person Ram Singh; 07.11.2012
comment
Если вы возвращаете значение из хранимой процедуры или используете переменные табличного типа, вам необходимо явно указать тип команды. Также тип команды по умолчанию не StoredProcedure. - person Anshuman Jasrotia; 07.11.2012