0

a) ストアド プロシージャを EF で動作させることも、b) EF LINQ クエリを動作させることもできないため、mysql ストアド プロシージャを呼び出そうとする次のコードがあります。 . 次のエラーは、VS が ExecuteQuery の行にパラメーターを提供するように要求しているためです。それは私がそれを呼び出す前にすでに行ったことではありませんか?

Public Shared Function GetNearestWeatherStationSql(ByVal lat As Decimal, longi As Decimal) As String
    Const connectionString As String = "server=xxxxxx;user=xxxxxx;database=xxxxxxx;port=xxxx;password=xxxxxxxx;"
    Dim conn As New MySqlConnection()
    conn.ConnectionString = connectionString

    Dim command As New MySqlCommand()
    command.CommandType = CommandType.StoredProcedure
    command.CommandText = "Call GetNearestWeatherStation()"
    command.Parameters.AddWithValue("@iLat", lat)
    command.Parameters.AddWithValue("@iLong", longi)
    command.Parameters.AddWithValue("@iWithinMiles", 15)
    command.Parameters.AddWithValue("@iTopN", 2)

    command.Connection = conn
    conn.Open()
    command.ExecuteNonQuery()

    conn.Close()


    Return "p"  'bogus value until I get SP to work
End Function
4

2 に答える 2

0

それはきれいではなく、適切なリファクタリングを示すことは誰にでもできることですが、私は各パラメーターを個別にコレクションに追加し、リーダーを使用してアクセスしました。

Public Shared Function GetNearestWeatherStationSql(ByVal lat As Decimal, longi As Decimal) As String
    Const connectionString As String = "xxxxxx"
    Dim conn As New MySqlConnection()
    conn.ConnectionString = connectionString

    Dim command As New MySqlCommand()
    command.CommandText = "GetNearestWeatherStation"
    command.CommandType = CommandType.StoredProcedure
    Dim param As New MySqlParameter()
    With param
        .ParameterName = "@iLat"
        .MySqlDbType = MySqlDbType.Decimal
        .Direction = ParameterDirection.Input
        .Value = lat
    End With
    command.Parameters.Add(param)
    Dim param1 As New MySqlParameter()
    With param1
        .ParameterName = "@iLong"
        .MySqlDbType = MySqlDbType.Decimal
        .Direction = ParameterDirection.Input
        .Value = longi
    End With
    command.Parameters.Add(param1)
    Dim param2 As New MySqlParameter()
    With param2
        .ParameterName = "@iWithinMiles"
        .MySqlDbType = MySqlDbType.Int32
        .Direction = ParameterDirection.Input
        .Value = 15
    End With
    command.Parameters.Add(param2)
    Dim param3 As New MySqlParameter()
    With param3
        .ParameterName = "@iTopN"
        .MySqlDbType = MySqlDbType.Int32
        .Direction = ParameterDirection.Input
        .Value = 2
    End With
    command.Parameters.Add(param3)
    command.Connection = conn
    conn.Open()
    Dim reader As MySqlDataReader = command.ExecuteReader()
    Dim stationlist As New List(Of String)
    If reader.HasRows() Then
        While reader.Read()
            stationlist.Add(reader("station_id").ToString())
        End While
    End If
    conn.Close()

    Return stationlist(0)  'bogus value until I get SP to work
End Function
于 2013-11-08T18:47:46.797 に答える
0

AddWithValue名前付きプレースホルダーの置換を提供します。しかし、クエリにプレースホルダーを入れていません。

command.CommandText = "Call GetNearestWeatherStation(@iLat, @iLong, @iWithinMiles, @iTopN)"
command.Parameters.AddWithValue("@iLat", lat)
command.Parameters.AddWithValue("@iLong", longi)
command.Parameters.AddWithValue("@iWithinMiles", 15)
command.Parameters.AddWithValue("@iTopN", 2)
于 2013-11-08T17:50:59.277 に答える