1

我有這樣的SPLINQ到SQL存儲過程的問題(它無法找出返回類型)

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並嘗試將我的linq的方法面板中的SP拖到設計視圖中的sql文件。

它告訴我它無法確定返回類型。我嘗試去屬性,但它沒有「無」作爲選擇,我不能輸入它。它應該是「無」,所以我如何將它設置爲「無」?

回答

1

是否有任何特別的原因,你必須從你的Linq-to-SQL模型中調用它?

我會採取務實的態度:

  • LINQ到SQL是偉大的獲取,處理,更新單記錄或小數據集
  • 用於批量加載和/或這樣的東西 - 爲什麼要把它壓入Linq-to-SQL?剛剛新興起來的一個SqlConnection,一個SqlCommand,並執行存儲過程....

UPDATE:調用從直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(); 
    }  
} 

當然,你可能要包裝成一個嘗試......異常catch塊處理等等 - 但這基本上是你需要使用直接ADO.NET調用存儲過程的代碼。

+0

我不必從linq調用它到sql,但它似乎是eaiser。我仍然不會有同樣的問題,但我需要seraliaze,它可能會需要一個XElement字符串?或者那只是linq想要的一些特別的東西?如果是這樣,那麼這種常規方式將如何?也可以更好地去使用sqlbulk而不是這個存儲過程? – chobo2 2010-05-20 20:45:45

+0

@ chobo2:不,很可能,您可以使用字符串類型參數來調用此存儲過程。對於大量的數據,是的,SqlBulkCopy肯定是更好的選擇。 – 2010-05-20 20:54:01

+0

所以更新我怎麼會與sqlConnection,sqlCommand和存儲過程? – chobo2 2010-05-21 04:06:03

0

您可以編輯您的.dbml文件.designer.cs,只需編輯您的存儲返回。 PROC。

您還應該用右鍵單擊.dbml文件,然後以xml打開以編輯它。

+0

那麼在.designer.cs中它已經是無效的。但在其他SP中,我在屬性窗口中會說「return type none」。 – chobo2 2010-05-20 19:49:02

+0

用右鍵單擊.dbml文件,然後用xml打開並用xml編輯器打開,將其放在SP的末尾,並刪除此SP的所有elemettype。 Rbacarin 2010-05-20 20:16:46