मुझे यह जानने की ज़रूरत है कि मुझे अपनी कस्टम टेबल-प्रकार में एक सॉर्ट-कॉलम जोड़ने की आवश्यकता है, जिसे मैं सॉर्ट करने के लिए उपयोग कर सकता हूं या यदि मैं भरोसा कर सकता हूं कि पैरामीटर का क्रम इस तरह के कॉलम के बिना भी रहता है।क्या तालिका-मूल्यवान-पैरामीटर का सॉर्ट-ऑर्डर वही रहने की गारंटी है?
यह मेरा प्रकार है:
CREATE TYPE [dbo].[VwdCodeList] AS TABLE(
[VwdCode] [varchar](50) NOT NULL
)
और इस एसक्यूएल में से एक है जहां इसका इस्तेमाल होता है: के रूप में आप मैं ROW_NUMBER
उपयोग कर रहा हूँ तरह-स्तंभ प्राप्त करने के लिए देख सकते हैं
/// <summary>
/// Inserts all new WatchListCodes for a given watchlist
/// </summary>
public const string InsertWatchListCodes = @"
INSERT INTO [dbo].[WatchListCodes]
([WatchListID]
,[VwdCode]
,[Sort])
SELECT @WatchListID, VwdCode, ROW_NUMBER()OVER(ORDER BY (SELECT 1))
FROM @VwdCodeList;";
मूल्य।
क्या मुझे तालिका-प्रकार में एक प्रकार-कॉलम जोड़ने की आवश्यकता है या क्या यह गारंटीकृत है (दस्तावेज) कि यह वही रहता है? ऐसा लगता है कि काम करता है। एक IEnumerable<string>
के लिए
SqlParameter vwdCodeListParameter = insertWatchListCodeCommand.Parameters.Add("@VwdCodeList", SqlDbType.Structured);
vwdCodeListParameter.TypeName = "[dbo].[VwdCodeList]";
vwdCodeListParameter.Value = WatchListSql.GetVwdCodeRecords(newVwdCodes, true);
int inserted = insertWatchListCodeCommand.ExecuteNonQuery();
GetVwdCodeRecords
रिटर्न IEnumerable<SqlDataRecord>
:
यह जहां मैं इसका इस्तेमाल ADO.NET कोड है।
धन्यवाद सब कुछ। यदि भविष्य के पाठक को यह जानने में दिलचस्पी है कि मैंने सॉर्ट-ऑर्डर की गारंटी कैसे दी है। के रूप में एक और कॉलम जोड़ कर सुझाव दिया मैं तालिका प्रकार modifed गया है:
CREATE TYPE [dbo].[VwdCodeList] AS TABLE(
[VwdCode] [varchar](50) NOT NULL,
[Sort] [smallint] NOT NULL
)
डालने-एसक्यूएल और भी आसान है क्योंकि तरह-स्तंभ में पारित हो जाता है और गणना नहीं है:
public const string InsertWatchListCodes = @"
INSERT INTO [dbo].[WatchListCodes]
([WatchListID]
,[VwdCode]
,[Sort])
SELECT @WatchListID, cl.VwdCode, cl.Sort
FROM @VwdCodeList cl;";
के लिए
public static IEnumerable<SqlDataRecord> GetVwdCodeRecords(IEnumerable<string> vwdCodes, bool trimCode = true)
{
short currentSort = 0;
foreach (string vwdCode in vwdCodes)
{
var record = new SqlDataRecord(
new SqlMetaData("VwdCode", SqlDbType.VarChar, 50),
new SqlMetaData("Sort", SqlDbType.SmallInt));
record.SetString(0, trimCode ? vwdCode.Trim() : vwdCode);
record.SetInt16(1, ++currentSort);
yield return record;
}
}
द्वारा स्पष्ट आदेश का उल्लेख न करें, संभावना है कि यह तालिका प्रकार परिभाषा पर निर्भर करता है। उदाहरण के लिए, अपने टेबल प्रकार पर प्राथमिक कुंजी को परिभाषित करने के क्रम में उस क्रम को बदलने का एक अच्छा मौका है जिसमें आपको अपने रिकॉर्ड वापस मिलते हैं। मैं तालिका प्रकार में एक और कॉलम जोड़ने और इसे अपने ADO.NET कोड में सेट करने का एक सुरक्षित दृष्टिकोण लेगा। – dasblinkenlight