Проблема хранимой процедуры в Linq to SQl (невозможно определить тип возвращаемого значения) - PullRequest
1 голос
/ 20 мая 2010

У меня есть этот SP

USE [Test]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[UsersInsert](@UpdatedProdData XML)
AS 
 INSERT INTO 
      dbo.UserTable(UserId,UserName,LicenseId,Password,PasswordSalt,Email,IsApproved,IsLockedOut,CreateDate,
      LastLoginDate,LastLockOutDate,FailedPasswordAttempts,RoleId)
      SELECT
         @UpdatedProdData.value('(/ArrayOfUsers/Users/UserId)[1]', 'uniqueidentifier'),
         @UpdatedProdData.value('(/ArrayOfUsers/Users/UserName)[1]', 'varchar(20)'),
         @UpdatedProdData.value('(/ArrayOfUsers/Users/LicenseId)[1]', 'varchar(50)'),
         @UpdatedProdData.value('(/ArrayOfUsers/Users/Password)[1]', 'varchar(128)'),
         @UpdatedProdData.value('(/ArrayOfUsers/Users/PasswordSalt)[1]', 'varchar(128)'),
         @UpdatedProdData.value('(/ArrayOfUsers/Users/Email)[1]', 'varchar(50)'),
         @UpdatedProdData.value('(/ArrayOfUsers/Users/IsApproved)[1]', 'bit'),
         @UpdatedProdData.value('(/ArrayOfUsers/Users/IsLockedOut)[1]', 'bit'),
         @UpdatedProdData.value('(/ArrayOfUsers/Users/CreateDate)[1]', 'datetime'),
         @UpdatedProdData.value('(/ArrayOfUsers/Users/LastLoginDate)[1]', 'datetime'),
         @UpdatedProdData.value('(/ArrayOfUsers/Users/LastLockOutDate)[1]', 'datetime'),
         @UpdatedProdData.value('(/ArrayOfUsers/Users/FailedPasswordAttempts)[1]', 'int'),
         @UpdatedProdData.value('(/ArrayOfUsers/Users/RoleId)[1]', 'int')

Теперь этот SP создает просто отлично. Это когда я иду на VS2010 и пытаюсь перетащить этот SP на панель методов моего файла linq to sql в режиме конструктора.

Он говорит мне, что не может определить тип возвращаемого значения. Я пытаюсь перейти к свойствам, но у него нет «none» в качестве выбора, и я не могу набрать его. Это должно быть «none», так как мне установить «none»?

Ответы [ 2 ]

1 голос
/ 21 мая 2010

Есть ли какая-то особая причина, по которой вам абсолютно необходимо вызывать это из вашей модели Linq-to-SQL ??

Я бы выбрал прагматический подход:

  • Linq-to-SQL отлично подходит для извлечения, обработки, обновления отдельных записей или небольших наборов данных
  • для массовых загрузок и / или подобных вещей - зачем втиснуть это в Linq-to-SQL ?? Просто создайте новый SqlConnection, SqlCommand и выполните этот сохраненный процесс ....

ОБНОВЛЕНИЕ: для вызова хранимого процесса из обычного ADO.NET вы должны использовать стандартный материал ADO.NET в качестве любой книги по программированию доступа к данным .NET или учебника ADO.NET (только что!) научит вас:

using(SqlConnection con = new SqlConnection(your-connection-string-here))
{
     string sprocName = "UsersInsert";

     using(SqlCommand cmd = new SqlCommand(sprocName, con))
     {
         cmd.CommandType = CommandType.StoredProcedure;

         cmd.CommandType = System.Data.CommandType.StoredProcedure;

         SqlParameter param1 = new SqlParameter("@UpdateXml", SqlDbType.VarChar, int.MaxValue);
         param1.Value = YourXmlValueHere;
         cmd.Parameters.Add(param1);

         con.Open();
         int result = cmd.ExecuteNonQuery();
         con.Close();
     }    
}

Конечно, вы можете захотеть обернуть это в блок try ... catch для обработки исключений и т. Д. - но в основном это код, который вам нужно будет вызывать для этого хранимого процесса с использованием прямой ADO.NET.

0 голосов
/ 20 мая 2010

Вы можете редактировать файл .designer.cs вашего .dbml, просто отредактируйте возврат вашего стора. Proc.

и вам также нужно щелкнуть правой кнопкой мыши в файле .dbml, а затем открыть в формате xml, чтобы изменить его.

...