سؤال

وأنا أتساءل إذا كان هناك طريقة أنيقة للتحقق من وجود DB؟ وباختصار، كيف اختبار الاتصال من سلسلة اتصال ديسيبل؟

والشكر

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

المحلول

وتعيين Initial Catalog=master في سلسلة الاتصال وتنفيذ:

select count(*) from sysdatabases where name = @name

ومع @name لتعيين اسم قاعدة البيانات.

إذا كنت تريد أن تحقق سلسلة الاتصال ككل (وليس وجود قاعدة بيانات مستقلة)، حاول الاتصال به في كتلة try/catch.

نصائح أخرى

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

DbConnection db = new SqlConnection(connection_string);
try
{
    db.Open();
}
catch ( SqlException e )
{
    // Cannot connect to database
}

لتغطية مجموعة من الاحتمالات (الخادم غير موجود، لا وجود قاعدة بيانات، لا لتسجيل الدخول، لا أذونات خادم أسفل، الخ) - أبسط الفكرة هي ببساطة لمحاولة الاتصال كالمعتاد، وأداء شيء تافه - SELECT GETDATE() على سبيل المثال. إذا كنت تحصل على استثناء، هناك مشكلة!

وهناك أوقات (وخاصة عند التعامل مع أنظمة خارج العملية) عندما try/catch هو الخيار الأكثر واقعية.

ومجرد محاولة لDBConnection.Open () ملفوفة في كتلة حاول اصطياد DBException.

وحول ما الأنيق الحل كما انك سوف تجد.

والمحاولة

IF NOT EXISTS(SELECT * FROM sys.databases WHERE [name] = @name)
   CREATE DATABASE @name;
GO

أو

IF db_id(@name) IS NOT NULL
   CREATE DATABASE @name;
GO

SqlConnection.ChangeDatabase (سلسلة) . وأعتقد أنه يمكن استخدام موارد الخادم أقل لغة الاستعلامات البنيويه ثم محاولة الاتصال الجديدة.

إذا كنت تستخدم إطار الكيان أو أنها متاحة لك، يمكنك الاتصال بكل بساطة <لأ href = "https://msdn.microsoft.com/en-us/library/gg696588(v=vs.113) .aspx اتصال "يختلط =" نوفولو "> Database.Exists () :

if (Database.Exists(connectionString))
{
    // do something
}
else
{
    // do something else
}

وهذا ما عملت بالنسبة لي للتحقق من وجود أي قاعدة بيانات بوستجرس مع C #:

private bool chkDBExists(string connectionStr, string dbname)
{
    using (NpgsqlConnection conn = new NpgsqlConnection(connectionStr))
    {
        using (NpgsqlCommand command = new NpgsqlCommand
            ($"SELECT DATNAME FROM pg_catalog.pg_database WHERE DATNAME = '{dbname}'", conn))
        {
            try
            {
                conn.Open();
                var i = command.ExecuteScalar();
                conn.Close();
                if (i.ToString().Equals(dbname)) //always 'true' (if it exists) or 'null' (if it doesn't)
                    return true;
                else return false;
            }
            catch (Exception e) { return false; }
        }
    }
}

و** وإذا ما استخدمت في البيان محاولة اللحاق يمكن ببساطة معرفة ما اذا كان عودة ExecuteScalar فارغة لتكون معدومة DB وليس فارغة إذا كان موجودا.

ويمكنك الحصول على قائمة قاعدة البيانات مع أدناه والتحقق من اسم ديسيبل الخاص بك:

USE master
GO  
SELECT name, database_id, create_date  
FROM sys.databases ;  
GO
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top