SORU
8 NİSAN 2011, Cuma


Nasıl saklı yordam için tablo değerli parametreleri geçirmek için .net kodu

MS SQL Server 2005 veritabanı var. Birkaç operasyon bir nvarchar olarak bir saklı yordam (virgülle ayırarak) önünden geçtiğim bir tablo parametreleri ve içten tek değerler bölün. Bu gibi SQL komutu parametreleri listesine ekliyorum:

cmd.Parameters.Add("@Logins", SqlDbType.NVarchar).Value = "jim18,jenny1975,cosmo";

Veritabanı göç için SQL Server 2008 var. Tablo değerli parametreleri olduğunu biliyorum, ve saklı yordamları onları nasıl kullanacağımı biliyorum. Ama bir SQL komutu parametreleri listesine bir tane geçirmek için nasıl bilmiyorum. Herkes Parameters.Add prosedürünün doğru sözdizimi biliyor mu? Yoksa bu parametre geçirmek için başka bir yol var mı?

CEVAP
28 Mayıs 2012, PAZARTESİ


DataTable, DbDataReader, ya da 7* *nesne tablo değerli TechNet makale başına parametre Table-Valued Parameters in SQL Server 2008 (ADO.NET) doldurmak için kullanılabilir.

Aşağıdaki örnek, ya da DataTable IEnumerable<SqlDataRecord>: Bir bir kullanarak gösterir

SQL Kodu

CREATE TABLE dbo.PageView
(
    PageViewID BIGINT NOT NULL CONSTRAINT pkPageView PRIMARY KEY CLUSTERED,
    PageViewCount BIGINT NOT NULL
);
CREATE TYPE dbo.PageViewTableType AS TABLE
(
    PageViewID BIGINT NOT NULL
);
CREATE PROCEDURE dbo.procMergePageView
    @Display dbo.PageViewTableType READONLY
AS
BEGIN
    MERGE INTO dbo.PageView AS T
    USING @Display AS S
    ON T.PageViewID = S.PageViewID
    WHEN MATCHED THEN UPDATE SET T.PageViewCount = T.PageViewCount   1
    WHEN NOT MATCHED THEN INSERT VALUES(S.PageViewID, 1);
END

C# Kodu

private static void ExecuteProcedure(bool useDataTable, string connectionString, IEnumerable<long> ids) {
    using (SqlConnection connection = new SqlConnection(connectionString)) {
        connection.Open();
        using (SqlCommand command = connection.CreateCommand()) {
            command.CommandText = "dbo.procMergePageView";
            command.CommandType = CommandType.StoredProcedure;

            SqlParameter parameter;
            if (useDataTable) {
                parameter = command.Parameters.AddWithValue("@Display", CreateDataTable(ids));
            }
            else {
                parameter = command.Parameters.AddWithValue("@Display", CreateSqlDataRecords(ids));
            }
            parameter.SqlDbType = SqlDbType.Structured;
            parameter.TypeName = "dbo.PageViewTableType";

            command.ExecuteNonQuery();
        }
    }
}

private static DataTable CreateDataTable(IEnumerable<long> ids) {
    DataTable table = new DataTable();
    table.Columns.Add("ID", typeof(long));
    foreach (long id in ids) {
        table.Rows.Add(id);
    }
    return table;
}

private static IEnumerable<SqlDataRecord> CreateSqlDataRecords(IEnumerable<long> ids) {
    SqlMetaData[] metaData = new SqlMetaData[1];
    metaData[0] = new SqlMetaData("ID", SqlDbType.BigInt);
    SqlDataRecord record = new SqlDataRecord(metaData);
    foreach (long id in ids) {
        record.SetInt64(0, id);
        yield return record;
    }
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Angry Paintballer

    Angry Paintb

    8 Ocak 2012
  • MatheusDosGames

    MatheusDosGa

    28 Aralık 2011
  • Metheud

    Metheud

    9 EYLÜL 2006