首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >参数不会从F#传递到MySql存储过程

参数不会从F#传递到MySql存储过程
EN

Stack Overflow用户
提问于 2020-06-13 09:37:57
回答 1查看 40关注 0票数 0

我想用来自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#代码:

代码语言:javascript
运行
复制
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#中的类似代码可以完美地工作:

代码语言:javascript
运行
复制
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;
        }
    }
}

重新创建测试数据库和表的几行代码:

代码语言:javascript
运行
复制
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 ;

先谢谢你-

EN

回答 1

Stack Overflow用户

发布于 2020-06-15 01:51:22

很简单:这是做什么的?

代码语言:javascript
运行
复制
command.CommandType = CommandType.StoredProcedure |> ignore

它只是比较了两个值。

应该是:

代码语言:javascript
运行
复制
command.CommandType <- CommandType.StoredProcedure |> ignore
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62354565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档