سؤال

لدي .NET 1.0 WebApp القديمة التي تحتاج إلى القليل من الصيانة المنجز عليها. لقد استخدمت الترقية التلقائي لترقيةها إلى .NET 3.5 (وأيضا حاولت لاحقا 2.0) ولكن الآن لا يمكن الاتصال بقاعدة البيانات.

على السطح هذا يبدو وكأنه مشكلة سلسلة اتصال Noob، لكنني أفكر في أنه من المرجح أن تكون مرتبطة ببعض المشكلة الدقيقة من الترقية.


أحصل على رسالة الخطأ العامة:

حدث خطأ أثناء إنشاء اتصال بالخادم. عند الاتصال ب SQL Server 2005، قد يكون سبب هذا الفشل حقيقة أنه في ظل الإعدادات الافتراضية SQL Server لا يسمح بالاتصالات عن بعد. (المزود: موفر الأنابيب المسماة، خطأ: 40 - تعذر فتح اتصال ب SQL Server)


شفرة المصدر أساسية جميلة، مع عدم وجود أجراس أو صفارات:

protected static SqlConnection objConn;

objConn = new SqlConnection(strConnectionString);

try
{
    objConn.Open();
}

كما جربته كما:

using (objConn = new SqlConnection(strConnectionString))
{
    objConn.Open();
    ...
}

تأتي سلسلة الاتصال من Web.config، واستخدام مصحح الأخطاء لتعيين نقطة انقطاع وإلقاء نظرة على خصائص الاتصال قبل أن تحاول فتحه، أستطيع أن أرى أن العثور على سلسلة الاتصال بشكل صحيح:

ConnectionString = "مصدر البيانات = xxx.xxx.xxx.xxx؛ الكتالوج الأولي = xxxxxx؛ معرف المستخدم = xxxxxx؛ كلمة المرور = xxxxxx"


حفنة من الأشياء التي أعتقد أنني استبعدت:

رسالة الخطأ هي نفسها سواء كانت الاتصال ب SQL Server 2005 أو SQL Server 2000.

لا توجد أخطاء أو تحذيرات في قائمة خطأ VS.

سلسلة الاتصال هي نفسها بضع مواقع ويب أخرى تستخدم أيضا نفس قاعدة البيانات، لذلك أعرف أن سلسلة الاتصال صحيحة.

لقد جربت وجودها بالاتصال من جهاز الكمبيوتر المحلي الخاص بي (حيث يمكنني الاتصال بقواعد البيانات عبر محلل استعلام SQL) ومن خادم الويب العادي، لذلك فهي ليست مشكلة جدار حماية، ولا هي مشكلة أقصى اتصالات.

يتصل بعنوان IP للخادم، لذلك لا يوجد مشكلة مستعرض الكمبيوتر (و WebApps الأخرى يمكنه توصيل غرامة.

TCP والأنابيب المسماة هي 2 بروتوكولات الشبكة التي تم تمكينها على خادم SQL.

إضافة "مكتبة الشبكة = dbmssocn؛" إلى سلسلة الاتصال يغير رسالة الخطأ لتضمين "موفر": TCP موفر، خطأ "(كان هناك شيء آخر قمت بتغييره في سلسلة الاتصال في اليوم الآخر الذي كان يؤثر أيضا على ذلك، لكنني لا أستطيع أن أتذكر ما الآن.)


لقد نظرت بالفعل من خلال 3 وظائف أخرى مماثلة على تجاوز المكدس:
(لا يمكن سرد الروابط هنا لأنني مستخدم جديد، لكن معرف السؤال الخاص بهم إذا أراد شخص آخر ربطهم بهم في تعليق: 63875، 1038888، 846479)
وكان هذا المقال على موقع آخر بعض الأفكار الجيدة للأشياء لمحاولة ذلك لم يساعد إما:
http://weblogs.sqlteam.com/tarad/archive/2008/05/23/60609.aspx.


أفضل تخميني هو أن شيئا ما ناتج عن الترقية بين إصدارات .NET - ربما خطأ ما في Web.config؟

إنه تطبيق C #، صغير جدا / أساسي، ولكن تم تقسيمه إلى ثلاثة مشاريع.

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

المحلول

اكتب تطبيق وحدة التحكم لا يفعل شيئا سوى محاولة الاتصال بقاعدة البيانات باستخدام الرمز الذي نشرته. من الصعب الترميز سلسلة الاتصال في برنامج وحدة التحكم.

بمعنى آخر، قم بإزالة جميع الانحرافات للتأكد من أن التعليمات البرمجية الأساسية التي تحاول تشغيلها تعمل بشكل صحيح.

نصائح أخرى

نظرا لأنه لم يكن هناك حل فعلي مقدم لهذه المشكلة، فهناك هو الذي ساعدني:

كان لدي نفس المشكلة بالضبط عندما قمت بترقية تطبيق ASP.NET 2.0 بشكل مثالي إلى .NET 3.5. يتم استضافة تطبيق الويب من قبل IIS 5.1 على نظام التشغيل Windows XP وأنا أستخدم SQL Server Express 2005. أستخدم سلسلة الاتصال التالية في Web.config:

<add name="myDbConnection" providerName="System.Data.SqlClient" connectionString="Data Source=http://localhost;Server=.\SQLEXPRESS;Initial Catalog=MyDatabaseName;Integrated Security=True"/>

حتى كما ترى، لا أفعل اتصال TCP هنا أو الاتصال بخادم بعيد. أنا فقط أقوم بربط مثيل SQLEXPRAPS على LocalHost من خلال الأنابيب المسماة. لهذا السبب اعتقدت، لن يكون لها أي شيء على الإطلاق مع السماح بالاتصالات عن بعد على SQL Server 2005. ولكن كما اكتشفت، فإنه يفعل ذلك! (لا أعرف السبب الفعلي لهذا!) قضيت بضع ساعات للعثور على ذلك، لذلك ربما هذا يساعد على شخص ما ...

ما عليك القيام به (يرجى استخدام Google للحصول على التفاصيل):

  1. السماح بالاتصالات المحلية والبعيدة عبر أداة تكوين منطقة السطح SQL Server 2005 (اخترت الخيار "باستخدام كلا من TCP / IP والأنقانات المسماة")
  2. تمكين خدمة متصفح SQL Server
  3. قم بتعيين منفذ TCP الاستماع إلى 1433 لجميع IPS عبر أداة إدارة تكوين SQL Server SQL
  4. استمتع بتشغيل تطبيق الويب الخاص بك :-)

لماذا كل هذا ضروري من أجل الاتصال بنجاح من تطبيق Web .NET 3.5 إلى SQL Server عندما يعمل بالفعل من .NET 2.0 هو خارجي!

وفق هذه, ، لا يأتي SQL 2005 تم تكوينه للسماح بالاتصالات المحلية أو البعيدة الواردة، وعليك تمكينه بنفسك.

أنا متأكد من أنك مررت بهذه الخطوات بالفعل ولكن ... حاول تمكين الاتصال عن بعد ل SQL Server وتمكين خدمة متصفح SQL Server. يمكن العثور على تجول كلاهما هنا.

يمكنك محاولة استخدام نوع آخر من سلسلة الاتصال. عادة ما يتم تنسيق سلاسل الاتصال الخاصة بي مثل:

<add name="DataFrom" connectionString="SERVER=[servername];Database=[dbname];UID=[userid];PWD=[password];"/>

هي الأداة الأخرى التي قلتها والتي تعمل أيضا. NET 3.5 تطبيقات؟



أنا أيضا فضولي كيف تمكنت من الحصول على هذه القطعة من التعليمات البرمجية

using (var = new SqlConnection(strConnectionString))
{
    objConn.Open();
    ...
}

أعتقد أنك تعني

using (objConn = new SqlConnection(strConnectionString)) 

حق؟

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