【问题标题】:Getting DATA from SQL Server by WCF Services using ADO.NET VB.NETWCF 服务使用 ADO.NET VB.NET 从 SQL Server 获取数据
【发布时间】:2017-08-06 14:20:01
【问题描述】:

我已将 WCF 服务附加到我的示例网站。
WCF 函数可以正常工作,但使用 SQL 查询从 SQL 服务器获取数据的函数除外。
我对VB.NET不是很熟悉,我的经验来自VBA,类似但设置查询有很大不同。

起初我尝试使用SqlDataReader 然后SqlDataAdapter - 结果相同。我的服务卡住了。
Visual Studio 显示 SQL Server 无法传递数据的错误,因为存在内部错误。
这很奇怪,因为当我在 Visual Studio 中使用“WCF 测试客户端”时,这两个函数都能正常工作并接收正确的数据。此外,当我将此功能直接附加到我的网站时,效果也很好。问题在于 WCF 使用它们。

下面是我的 SQLDataAdapter 函数

Public Function GetCookiesPriceDS(ByVal nameOfCookie As String) _
    As DataSet Implements IService1.GetCookiesPriceDS

    Dim queryString As String
    Dim dataSet As DataSet = New DataSet("temporary")
    queryString = "select CookiesPrice from " &
    "tblCookies where CookiesName='" & nameOfCookie & "'"
    Using connection As New SqlConnection _
        ("Server= xyz\SQLEXPRESS; Database = Cookies2; " &
        "Integrated Security = true;User Id = xyz;Password = xyz")
        Dim adapter As New SqlDataAdapter()
        adapter.SelectCommand = New SqlCommand(queryString, connection)
        adapter.Fill(dataSet)
        Return dataSet
    End Using
End Function

【问题讨论】:

  • 您的连接字符串指定应使用集成安全性,但它还指定了用户凭据,这没有意义。您想使用您提供的凭据还是以运行该服务的用户身份登录?
  • 另外,您的代码容易受到 SQL 注入攻击。使用参数化查询。还有一件事——SqlDataAdapter 和 SqlCommand 都实现了 IDisposable 接口,你应该在 using 语句中使用它们。最后一个提示 - 这是我个人的意见 - 不要去 vb.net。转到 c#。语法的相似之处只会让您感到困惑,因为 vb.Net 的工作原理与 VBA 完全不同。
  • @jmcilhinney ok 从字符串中删除了用户和密码信息。谢谢大家的提示,但我仍然不知道如何解决这个问题:(
  • 您根本没有收到错误消息吗?
  • 那么,您是在说,实际上并没有说,您确实想使用运行该服务的同一帐户连接到数据库吗?如果在调用Fill 之前在连接对象上调用Open 会发生什么? Fill 将隐式打开和关闭连接,因此显式执行此操作将指示问题是连接还是查询。

标签: sql sql-server vb.net wcf ado.net


【解决方案1】:

好的,我在 vb.net 中找到了一些示例代码并做了一些小改动。它不起作用,因为在“WCF 测试客户端”中,函数旁边出现红色符号,并带有注释 - “WCF 测试客户端不支持此操作,因为它使用 WcfService.CookiesData 类型”但尽管如此,我认为这段代码要好得多比我以前的版本,并且在 和 中有更好的定义。但是还是有一些问题,我不知道是什么问题

Imports System.Data.SqlClient Imports System.Data Imports System.Configuration Imports System.ServiceModel Imports System.Runtime.Serialization Public Class Service1 Implements IService1 Public Function GetCookiesPriceDS(ByVal nameOfCookie As String) _ As CookiesData Implements IService1.GetCookiesPriceDS Using con As New SqlConnection("Server= xyz\SQLEXPRESS; Database = Cookies2; " & "Integrated Security = true;") Using cmd As New SqlCommand("select CookiesPrice from tblCookies where CookiesName='" & nameOfCookie & "'") Using sda As New SqlDataAdapter() cmd.Connection = con sda.SelectCommand = cmd Using dt As New DataTable() Dim ck As New CookiesData() sda.Fill(ck.CustomersTable) Return ck End Using End Using End Using End Using End Function End Class <ServiceContract()> Public Interface IService1 <OperationContract()> Function GetCookiesPriceDS(ByVal nameOfCookie As String) As CookiesData End Interface <DataContract()> Public Class CookiesData Public Sub New() CustomersTable = New DataTable("TblCookies") End Sub <DataMember()> Public Property CustomersTable() As DataTable End Class

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-30
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    相关资源
    最近更新 更多