是否需要在PC上安装SQL客户端才能使C#应用程序访问数据库?

时间:2012-08-27 08:31:08

标签: c# wpf sql-server

我创建了一个管理数据库数据的C3 WPF应用程序。 到目前为止,我已成功地在3台PC上使用它,但它在第四台上崩溃了。例外是:

Faulting application name: LakeSmitFautLog.exe, version: 1.0.0.0, time stamp: 0x503b19ee
Faulting module name: KERNELBASE.dll, version: 6.1.7601.17651, time stamp: 0x4e2111c0
Exception code: 0xe0434352

Application: LakeSmitFautLog.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.Data.SqlClient.SqlException
Stack:
   at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(System.Data.Common.DbConnection, System.Data.ProviderBase.DbConnectionFactory)
   at System.Data.SqlClient.SqlConnection.Open()
   at LakeSmitFautLog.MainWindow.LoadComboBoxes()
   at LakeSmitFautLog.MainWindow..ctor()
   at LakeSmitFautLog.initxaml.btnEnter_Click(System.Object, System.Windows.RoutedEventArgs)
   at System.Windows.RoutedEventHandlerInfo.InvokeHandler(System.Object, System.Windows.RoutedEventArgs)
   at System.Windows.EventRoute.InvokeHandlersImpl(System.Object, System.Windows.RoutedEventArgs, Boolean)
   at System.Windows.UIElement.RaiseEventImpl(System.Windows.DependencyObject, System.Windows.RoutedEventArgs)
   at System.Windows.UIElement.RaiseEvent(System.Windows.RoutedEventArgs)
   at System.Windows.Controls.Primitives.ButtonBase.OnClick()
   at System.Windows.Controls.Button.OnClick()
   at System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(System.Windows.Input.MouseButtonEventArgs)
   at System.Windows.UIElement.OnMouseLeftButtonUpThunk(System.Object, System.Windows.Input.MouseButtonEventArgs)
   at System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(System.Delegate, System.Object)
   at System.Windows.RoutedEventArgs.InvokeHandler(System.Delegate, System.Object)
   at System.Windows.RoutedEventHandlerInfo.InvokeHandler(System.Object, System.Windows.RoutedEventArgs)
   at System.Windows.EventRoute.InvokeHandlersImpl(System.Object, System.Windows.RoutedEventArgs, Boolean)
   at System.Windows.UIElement.ReRaiseEventAs(System.Windows.DependencyObject, System.Windows.RoutedEventArgs, System.Windows.RoutedEvent)
   at System.Windows.UIElement.OnMouseUpThunk(System.Object, System.Windows.Input.MouseButtonEventArgs)
   at System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(System.Delegate, System.Object)
   at System.Windows.RoutedEventArgs.InvokeHandler(System.Delegate, System.Object)
   at System.Windows.RoutedEventHandlerInfo.InvokeHandler(System.Object, System.Windows.RoutedEventArgs)
   at System.Windows.EventRoute.InvokeHandlersImpl(System.Object, System.Windows.RoutedEventArgs, Boolean)
   at System.Windows.UIElement.RaiseEventImpl(System.Windows.DependencyObject, System.Windows.RoutedEventArgs)
   at System.Windows.UIElement.RaiseTrustedEvent(System.Windows.RoutedEventArgs)
   at System.Windows.UIElement.RaiseEvent(System.Windows.RoutedEventArgs, Boolean)
   at System.Windows.Input.InputManager.ProcessStagingArea()
   at System.Windows.Input.InputManager.ProcessInput(System.Windows.Input.InputEventArgs)
   at System.Windows.Input.InputProviderSite.ReportInput(System.Windows.Input.InputReport)
   at System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr, System.Windows.Input.InputMode, Int32, System.Windows.Input.RawMouseActions, Int32, Int32, Int32)
   at System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr, MS.Internal.Interop.WindowMessage, IntPtr, IntPtr, Boolean ByRef)
   at System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef)
   at MS.Win32.HwndWrapper.WndProc(IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef)
   at MS.Win32.HwndSubclass.DispatcherCallbackOperation(System.Object)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate, System.Object, Int32)
   at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(System.Object, System.Delegate, System.Object, Int32, System.Delegate)
   at System.Windows.Threading.Dispatcher.InvokeImpl(System.Windows.Threading.DispatcherPriority, System.TimeSpan, System.Delegate, System.Object, Int32)
   at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr, Int32, IntPtr, IntPtr)
   at MS.Win32.UnsafeNativeMethods.DispatchMessage(System.Windows.Interop.MSG ByRef)
   at System.Windows.Threading.Dispatcher.PushFrameImpl(System.Windows.Threading.DispatcherFrame)
   at System.Windows.Threading.Dispatcher.PushFrame(System.Windows.Threading.DispatcherFrame)
   at System.Windows.Application.RunDispatcher(System.Object)
   at System.Windows.Application.RunInternal(System.Windows.Window)
   at System.Windows.Application.Run(System.Windows.Window)
   at LakeSmitFautLog.App.Main()

在前3台PC上,安装了一个独立的MS SQL客户端,但没有安装错误的客户端。
在应用程序中,我引用System.Data.SqlClient,但似乎这还不够。

如上所述,这台PC需要安装一个独立的SQL客户端吗?

[编辑]可能的解决方案需要从SQL Server禁用防火墙。问题可能在于它没有获得本地IP(第四台PC来自不同的场所,具有不同的IP范围)。

4 个答案:

答案 0 :(得分:2)

简短的回答是

来自文档:

  

SQL Server的.NET Framework数据提供程序(SqlClient)使用它   自己的协议与SQL Server进行通信。它很轻巧   表现良好,因为它已经过优化,可以直接访问SQL Server   无需添加OLE DB或开放式数据库连接(ODBC)层。   下图对比了.NET Framework数据提供程序   适用于OLE DB的.NET Framework数据提供程序的SQL Server。该   用于OLE DB的.NET Framework数据提供程序与OLE DB数据通信   通过提供的OLE DB服务组件来源   连接池和事务服务以及OLE DB提供程序   对于数据源。

Microsoft Sql Client Database Access

http://msdn.microsoft.com/en-us/library/a6cd7c08.aspx

那么......怎么了?

正如其他评论员指出的那样,你对异常处理有所了解;实际的异常似乎没有被捕获。

鉴于你已经说过同样的exe工作在其他3台机器上,你真的需要实际的异常消息来判断它是否是:

  1. 环境(可能是机器无法连接到数据库服务器)
  2. 基于用户(由于没有连接数据库服务器的权限而运行的用户)
  3. 基于时间(服务器刚刚不可用,因此连接失败。)
  4. 如果你想发布LoadComboBoxes的代码(或者至少是数据库工作的那一部分),那么这可能有助于我们提供一些进一步的建议。

答案 1 :(得分:1)

不,这不是由SQL Express引起的,并不是强制要求你安装它来运行应用程序,但它似乎确实缺少了一个DLL。我首先检查你是否安装了框架4.0。此外,如果您使用的是不在.NET框架中的库,请确保在所需的引用属性上设置Copy Local = true。

答案 2 :(得分:0)

我100%确定您不需要安装SQL客户端来访问数据库。

答案 3 :(得分:0)

看看LoadComboBoxes例程如何打开连接。连接字符串中的某些内容是否在该计算机上不正确? .nEt框架应该已经包含了连接到Sql的所有pre-req。