SqlCommand.ExecuteScalar - указать конкретный элемент данных - PullRequest
1 голос
/ 01 июня 2011

У меня есть хранимая процедура, которая возвращает 10 столбцов данных. Использование cmd.ExecuteScalar() возвращает значение 1-го столбца из 1-й записи.

Как я могу изменить это, чтобы я мог возвращать различные столбцы, указав их псевдоним / имя элемента данных?

Я хочу иметь возможность сделать что-то вроде:

Dim FirstName as String = cmd.ExecuteScalar("FirstName")

Ответы [ 4 ]

2 голосов
/ 01 июня 2011

Вы можете создать метод, который вызывает ExecuteReader, а затем использует GetOrdinal с именем столбца, чтобы затем вызвать GetString.

Мой VB не существует, но это C # для метода расширения.

public static class SqlCommandExt
{
    public static string ExecuteScalar(this SqlCommand cmd, string columnName)
    {
        using (var reader = cmd.ExecuteReader())
        {
            if (!reader.Read())
                return null;

            var index = reader.GetOrdinal(columnName);
            return reader.GetString(index);
        }
    }
}
1 голос
/ 01 июня 2011

Вы можете создать метод расширения, чтобы сделать это для вас.Эквивалент C # (который, я думаю, вы могли бы легко перевести на расширение VB.NET ):

public static T ExecuteScalar<T>(this SqlCommand cmd, String columnName)
{
    using(var reader = cmd.ExecuteReader())
    {
        var item = default(T);
        if(reader.Read())
        {
            item = (T)dataReader.GetValue(dataReader.GetOrdinal(columnName))
        }
        return item;
    }
}

... и вызвать его так:

1 голос
/ 01 июня 2011

Вы не можете.Command.ExecuteScalar не принимать параметров ..

Что вы можете сделать, это использовать текстовую команду и изменить ее значение свойства CommandText, чтобы включить столбец, который вам нужно получить:

command.CommandText = "SELECT " + columnName + " FROM Table WHERE Key = " + ...
0 голосов
/ 02 июня 2011

Вам также следует попробовать приведенный ниже код.

Private Sub YourFunctionName()
        Using con As System.Data.SqlClient.SqlConnection = New SqlConnection("YourConnection string")
            con.Open()
            Using cmd As SqlCommand = New SqlCommand
                Dim expression As String = "Parameter value"
                cmd.CommandType = CommandType.StoredProcedure
                cmd.CommandText = "Your Stored Procedure"
                cmd.Parameters.Add("Your Parameter Name", SqlDbType.VarChar).Value = expression
                cmd.Connection = con
                Using dr As IDataReader = cmd.ExecuteReader()
                    If dr.Read() Then
                        Dim str As String = dr("YourColumnName").ToString()
                    End If
                End Using
            End Using
        End Using
    End Sub
...