代码之家  ›  专栏  ›  技术社区  ›  Skitzafreak

从存储过程获取查询结果

  •  1
  • Skitzafreak  · 技术社区  · 8 年前

    我正在用VB.NET开发一个程序,该程序使用LINQ与数据库接口。现在,我正试图从数据库上的以下存储过程中获取数据:

    CREATE PROCEDURE dbo.GetTableColumn(
        @ColName VARCHAR(MAX),
        @TblName VARCHAR(MAX),
        @Result  BIT OUT
    ) AS
    BEGIN
        IF (EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @TblName AND COLUMN_NAME = @ColName))
            BEGIN
                DECLARE @SQL VARCHAR(MAX)
                SET @SQL = 'SELECT ' + @ColName + ' FROM ' + @TblName
                EXEC (@SQL)
                SET @Result = 1
            END
        ELSE
            SET @RESULT = 0
        RETURN @Result
    END
    

    该过程的目标是,我可以发送一个列名和表名作为变量,如果该列存在于表中,则返回表中的数据。

    我已将该过程添加到我的DataLinqContext中,这是引用该过程的代码:

    Public Function GetTableColumn(ByVal col As String, ByVal table As String) As AutoCompleteStringCollection
        GetTableColumn = New AutoCompleteStringCollection
        Using dbContext As New Customer_LINQDataContext
            Dim result As Boolean
            Dim query = dbContext.GetTableColumn(col, table, result)
            MessageBox.Show(query.ToString())
        End Using
    End Function
    

    现在,我将在消息框对话框中测试输出数据。然而,每次方法运行时,结果总是 1 0 . 我永远无法获得我要查询的实际数据。

    那么,我在这里做错了什么,我该如何修复它呢?

    编辑:我询问了数据库管理堆栈交换,看看是否有人可以提供任何帮助。我得到了下面的答案,希望能有所帮助,但我仍然不确定如何解决这个问题。

    您的代码正在获取存储过程结束时返回@result的结果。要传递的结果将作为结果集从存储过程中传出。您需要使用DataReader对象来查看行。

    我不知道如何使用LINQ来实现这一点。希望您能在stackoverflow问题上得到更好的答案。

    2 回复  |  直到 8 年前
        1
  •  0
  •   AMG    8 年前

    CREATE PROCEDURE dbo.GetTableColumn(
        @ColName VARCHAR(MAX),
        @TblName VARCHAR(MAX)
    ) AS
    BEGIN
        IF (EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @TblName AND COLUMN_NAME = @ColName))
            BEGIN
                DECLARE @SQL VARCHAR(MAX)
                SET @SQL = 'SELECT ' + @ColName + ' FROM ' + @TblName
                EXEC (@SQL)
            END
        ELSE
            RETURN 1
    END
    

    Dim query = dbContext.GetTableColumn(col, table)
    
        2
  •  0
  •   Skitzafreak    8 年前

    CREATE PROCEDURE dbo.GetTableColumn(
        @ColName VARCHAR(25),
        @TblName VARCHAR(25)
    ) AS
    BEGIN
        IF (EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @TblName AND COLUMN_NAME = @Col_Name))
            BEGIN
                DECLARE @SQL VARCHAR(MAX)
                SET @SQL = 'SELECT ' + @ColName + ' FROM ' + @TblName + ' WHERE ' + @ColName + ' IS NOT NULL'
                EXEC (@SQL)
            END
        ELSE
            RETURN 1
    END
    

    Public Function ExecuteCMD(ByRef CMD As SqlCommand) As DataSet
        Dim DS As New DataSet()
        Try
            OpenDBConnection() 'Custom class to open the DB Connection'
            CMD.Connection = DB_CONNECTION 'Private member set to db connection on initialization'
    
            If CMD.CommandText.Contains(" ") Then
                CMD.CommandType = CommandType.Text
            Else
                CMD.CommandType = CommandType.StoredProcedure
            End If
    
            Dim adapter as New SqlDataAdapter(CMD)
            adapter.SelectCommand.CommandTimeout = 300
    
            adapter.Fill(DS)
            CloseDBConnection 'Custom class to close DB Connection'
        Catch ex As Exception
            Throw New Exception("Database Error: " & ex.Message)
        End Try
        Return DS
    End Function
    

    here GetTableColumn

    Public Function GetTableColumn(ByVal col As String, ByVal table As String) As AutoCompleteStringCollection
        GetTableColumn = New AutoCompleteStringCollection
        Dim CMD As New SqlCommand("GetTableColumn")
        CMD.Parameters.Add("@ColName", SqlDbType.VarChar).Value = col
        CMD.Parameters.Add("@TblName", SqlDbType.VarChar).Value = table
        Dim DS As DataSet = ExecuteCMD(CMD)
        For Each DR As DataRow In DS.Tables(0).Rows
            If Not IsNothing(DR(0)) Then GetTableColumn.Add(CStr(DR(0)))
        Next
    End Function