سؤال

أشعر وكأنني أحمق لمجرد طرح هذا السؤال، لكنني لا أحصل على أي مساعدة من Google، وقد قمت بالتصفح عبر جميع نتائج SO في بحث بسيط عن SMO ولم أرها أيضًا.

النسخة القصيرة هي أنني بدأت اللعب مع T4.أنا أتوسع البرنامج التعليمي الأولي لأوليج سيش لتوفير التعداد على كافة الجداول لإنشاء عملية حذف (IMHO سخيفة إلى حد ما).هذه مجرد تجربة، لذا فإن عدم جدواها المطلق لا يزعجني.:)

يبدو التوسع الخاص بي في البرنامج التعليمي لـ Oleg كما يلي:

<#@ template language="C#" hostspecific="true" #>
<#@ output extension="SQL" #>
<#@ assembly name="Microsoft.SqlServer.ConnectionInfo" #>
<#@ assembly name="Microsoft.SqlServer.Smo" #>
<#@ import namespace="Microsoft.SqlServer.Management.Smo" #>
<#@ include file="T4Toolbox.tt" #>
<#
    // Config variables
    string serverName = "dbserver\\dbinstance";
    string dbName = "dbname";
#>
USE <#= dbName #>
<#  
    // Iterate over tables and generate procs
    Server server = new Server(serverName);
    Database database = new Database(server, dbName);

    WriteLine("/* Number of tables: " + database.Tables.Count.ToString() + " */");

    foreach (Table table in database.Tables)
    {
        table.Refresh();
#>
CREATE PROCEDURE <#= table.Name #>_Delete
<#
        PushIndent("    ");
        foreach (Column column in table.Columns)
        {
            if (column.InPrimaryKey)
                WriteLine("@" + column.Name + " " + column.DataType.Name);
        }
        PopIndent();
#>
AS
    DELETE FROM 
        <#= table.Name #>
    WHERE
<#
        PushIndent("        ");
        foreach (Column column in table.Columns)
        {
            if (column.InPrimaryKey)
                WriteLine(column.Name + " = @" + column.Name);
        }
        PopIndent();
        WriteLine("GO");
    }
#> 

المشكلة هي أنه لم يتم إرجاع أي جداول من الملف Tables مجموعة.يتم التحقق من صحة ذلك من خلال عدد الجداول في تعليق SQL الذي أقوم بإنشائه، والذي يتم إخراجه 0.

كما هو مكتوب، الكود أعلاه ينشئ ما يلي:

USE dbname
/* Number of tables: 0 */

ومع ذلك، إذا قمت بإزالة حلقة for وقمت يدويًا بتوفير اسم جدول صالح موجود في قاعدة البيانات هذه، فسيتم إنشاء proc (مرة أخرى سخيفة) - لهذا الجدول.

تم فصل الجداول إلى مخطط، هل هذا مهم؟كما أن هذا يتعارض مع مثيل SQL2005 - هل من المحتمل أن يسبب ذلك مشكلات؟

وأخيرًا، أجد أيضًا أنه لا يمكنني تعداد المرادفات عبر مجموعة المرادفات.(اعتقدت أنني سأكون ذكيًا وأتبع هذا الطريق نظرًا لأن الجداول موجودة في مخطط، ولكن تم تحديد المرادفات.لكن ...لا النرد.)

مرة أخرى، للتأكيد مرة أخرى، الكود أعلاه ليس منتجًا بطبيعة الحال، ولا حتى يستحق الإنتاج.أنا فقط أحاول تعلم كل من T4 وSMO، وأصطدم بحاجز في محاولة القيام بشيء كنت أعتقد أنه سيكون بسيطًا إلى حد يبعث على السخرية.:)

هل كانت مفيدة؟

المحلول

لا يقوم SMO باسترداد بيانات التعريف تلقائيًا إذا قمت ببساطة بإنشاء مثيل جديد لفئة قاعدة البيانات.يمكن أن يستغرق استرداد البيانات التعريفية بعض الوقت، خاصة في بيئة باردة.قم باستدعاء قاعدة البيانات.Refresh() قبل الحلقة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top