我想用来自F#的参数调用一个存储过程,但它导致异常"MySql.Data.MySqlClient.MySqlException (0x80004005):过程test.GetValue的参数数目不正确;预期为1,得到0“。
C#中的类似代码可以完美地工作。
这是.NetCoreApp3.1,FSharp.Core/4.7.0和MySql.Data/8.0.20。MySql服务器为8.0.20,操作系统为Ubuntu18.04.4LTS。
问:我在做某事吗?是错误的还是错误的?
注意:如果我从存储过程中删除参数,并在其SELECT查询中对其进行硬编码,那么它在F#中工作得很好。此外,在调试时,我可以在调用之前完美地看到参数。
导致异常的F#代码:
module test_mysql_fsharp.main
open System
open System.Data
open MySql.Data.MySqlClient
[<EntryPoint>]
let main argv =
Console.WriteLine("Hello from test_mysql_fsharp !");
let execStoredProc cs storedProcedureName storedProcedureParameters =
use mySqlConnection = new MySqlConnection(cs)
use command = new MySqlCommand(storedProcedureName, mySqlConnection)
command.CommandType = CommandType.StoredProcedure |> ignore
storedProcedureParameters |> List.iter(fun par -> command.Parameters.AddWithValue(par) |> ignore)
mySqlConnection.Open()
let dataTable = new DataTable()
dataTable.Load(command.ExecuteReader())
dataTable
let cs = "server=127.0.0.1;port=3306;database=test;Uid=***;Pwd=***;"
execStoredProc cs "GetValue" [("par0","KA")] |> ignore
0 C#中的类似代码可以完美地工作:
using System;
using System.Collections.Generic;
using System.Data;
using MySql.Data.MySqlClient;
namespace test_mysql_csharp
{
static class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello from test_mysql_csharp !");
var cs = "server=127.0.0.1;port=3306;database=test;Uid=***;Pwd=***;";
var sp = "GetValue";
var ps = new List<MySqlParameter>();
var p = new MySqlParameter("par0", "KA");
ps.Add(p);
var b = ExecStoredProc(cs, sp, ps.ToArray());
}
private static System.Data.DataTable ExecStoredProc(string cs, string spName,
params MySqlParameter[] spParams)
{
using MySqlConnection connection = new MySqlConnection(cs);
using MySqlCommand command = new MySqlCommand(spName, connection);
command.CommandType = CommandType.StoredProcedure;
command.Parameters.AddRange(spParams);
connection.Open();
DataTable dt = new DataTable();
dt.Load(command.ExecuteReader());
return dt;
}
}
}重新创建测试数据库和表的几行代码:
CREATE SCHEMA `test` DEFAULT CHARACTER SET latin1 COLLATE latin1_general_ci ;
use test;
CREATE TABLE `test`.`test` (
`k` VARCHAR(64) NOT NULL,
`v` VARCHAR(64) NULL,
PRIMARY KEY (`k`));
INSERT INTO test.test (k,v) values ('KA','VA');
DELIMITER $$
CREATE PROCEDURE `GetValue`(par0 varchar(64))
BEGIN
select * from test.test where k = par0;
END$$
DELIMITER ;先谢谢你-
发布于 2020-06-15 01:51:22
很简单:这是做什么的?
command.CommandType = CommandType.StoredProcedure |> ignore它只是比较了两个值。
应该是:
command.CommandType <- CommandType.StoredProcedure |> ignorehttps://stackoverflow.com/questions/62354565
复制相似问题