深圳全飞鸿

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 718|回复: 0
打印 上一主题 下一主题

C# 动态参数方式调用MYSQL存储过程

[复制链接]

800

主题

1379

帖子

7704

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7704
跳转到指定楼层
楼主
发表于 2021-3-14 10:53:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
未验证!

由于MYSQL或MSSQL存储过程参数不确定,一般情况下.net 调用存储过程时需针对具体存储过程写不同的调用方法。 本文通过实现先调用系统表中存储过程参数列表,针对参数名称、类型、精度、长度等,动态生成存储过程调用参数,为通用的存储过程调用提供方便。注意类型转换部分要仔细自行验证,确保转换正确。用于MSSQL时类型转换有所不同。

  1. /// <summary>
  2. /// 获取存储过程的参数,生成存储过程调用参数列表
  3. /// </summary>
  4. /// <param name="ProcedureName">存储过程名称</param>
  5. /// <param name="parameters">存储过程调用参数值集合</param>
  6. /// <returns></returns>
  7. private MySqlParameter[] GetMySQLParameters(string ProcedureName, object[] parameters)
  8. {
  9.     DataTable dt = new DataTable();
  10.     string sqlString = "select * from INFORMATION_SCHEMA.PARAMETERS where SPECIFIC_NAME='" + ProcedureName + "' order by ORDINAL_POSITION";
  11.     if (!Select(sqlString, dt))
  12.         return null;

  13.     List<MySqlParameter> sqlParameters = new List<MySqlParameter>();
  14.     for (int i = 0; i < dt.Rows.Count; i++)
  15.     {
  16.         MySqlParameter sqlParameter = new MySqlParameter();
  17.         sqlParameter.ParameterName = dt.Rows[i]["PARAMETER_NAME"].ToString();
  18.         sqlParameter.Direction = (dt.Rows[i]["PARAMETER_MODE"].ToString() == "IN") ? ParameterDirection.Input : ParameterDirection.Output;


  19.         #region 匹配参数类型
  20.         switch (dt.Rows[i]["DATA_TYPE"].ToString().ToLower ())
  21.         {
  22.             case "bit":
  23.                 if (sqlParameter.Direction == ParameterDirection.Input)
  24.                     sqlParameter.Value = (bool)(parameters[i]);
  25.                 sqlParameter.MySqlDbType = MySqlDbType.Bit;
  26.                 break;

  27.             case "int64":
  28.                 if (sqlParameter.Direction == ParameterDirection.Input)
  29.                     sqlParameter.Value = Convert.ToInt64(parameters[i]);
  30.                 sqlParameter.MySqlDbType = MySqlDbType.Int64;
  31.                 break;
  32.             case "int":
  33.             case "int32":
  34.                 if (sqlParameter.Direction == ParameterDirection.Input)
  35.                     if (parameters[i] == DBNull.Value)//参数为DBNull时
  36.                     {
  37.                         sqlParameter.Value = DBNull.Value;
  38.                     }
  39.                     else
  40.                     {
  41.                         sqlParameter.Value = Convert.ToInt32(parameters[i]);
  42.                     }

  43.                 sqlParameter.MySqlDbType = MySqlDbType.Int32;
  44.                 break;

  45.             case "decimal":
  46.                 if (sqlParameter.Direction == ParameterDirection.Input)
  47.                     sqlParameter.Value = Convert.ToDecimal(parameters[i]);
  48.                 sqlParameter.MySqlDbType = MySqlDbType.Decimal;
  49.                 sqlParameter.Precision = Convert.ToByte(dt.Rows[i]["NUMERIC_PRECISION"]);
  50.                 sqlParameter.Scale = Convert.ToByte(dt.Rows[i]["NUMERIC_SCALE"]);
  51.                 break;

  52.             case "varchar":
  53.                 if (sqlParameter.Direction == ParameterDirection.Input)
  54.                     sqlParameter.Value = parameters[i];
  55.                 sqlParameter.Size = (int)dt.Rows[i]["CHARACTER_MAXIMUM_LENGTH"];
  56.                 sqlParameter.MySqlDbType = MySqlDbType.VarChar;
  57.                 break;


  58.             case "tinyblob":
  59.                 if (sqlParameter.Direction == ParameterDirection.Input)
  60.                     sqlParameter.Value = (string)parameters[i];
  61.                 sqlParameter.MySqlDbType = MySqlDbType.TinyBlob;
  62.                 break;

  63.             case "meduimblob":
  64.                 if (sqlParameter.Direction == ParameterDirection.Input)
  65.                     sqlParameter.Value = (string)parameters[i];
  66.                 sqlParameter.MySqlDbType = MySqlDbType.MediumBlob;
  67.                 break;
  68.             case "longblob":
  69.                 if (sqlParameter.Direction == ParameterDirection.Input)
  70.                     sqlParameter.Value = (string)parameters[i];
  71.                 sqlParameter.MySqlDbType = MySqlDbType.LongBlob;
  72.                 break;
  73.             case "blob":
  74.                 if (sqlParameter.Direction == ParameterDirection.Input)
  75.                     sqlParameter.Value = (string)parameters[i];
  76.                 sqlParameter.MySqlDbType = MySqlDbType.Blob;
  77.                 break;

  78.             case "tinytext":
  79.                 if (sqlParameter.Direction == ParameterDirection.Input)
  80.                     sqlParameter.Value = (string)parameters[i];
  81.                 sqlParameter.MySqlDbType = MySqlDbType.TinyText;
  82.                 break;
  83.             case "text":
  84.                 if (sqlParameter.Direction == ParameterDirection.Input)
  85.                     sqlParameter.Value = (string)parameters[i];
  86.                 sqlParameter.MySqlDbType = MySqlDbType.Text;
  87.                 break;

  88.             case "datetime":
  89.                 if (sqlParameter.Direction == ParameterDirection.Input)
  90.                     sqlParameter.Value = parameters[i];
  91.                 sqlParameter.MySqlDbType = MySqlDbType.DateTime;
  92.                 break;
  93.             case "smalldatetime":
  94.                 if (sqlParameter.Direction == ParameterDirection.Input)
  95.                     sqlParameter.Value = (DateTime)parameters[i];
  96.                 sqlParameter.MySqlDbType = MySqlDbType.DateTime;
  97.                 break;

  98.             case "uniqueidentifier":
  99.                 sqlParameter.MySqlDbType = MySqlDbType.Text;
  100.                 break;

  101.             default: break;
  102.         }
  103.         #endregion

  104.         sqlParameters.Add(sqlParameter);
  105.     }

  106.     return sqlParameters.ToArray ();
  107. }

  108. /// <summary>
  109. /// 调用存储过程基本方法,返回DataSet结果
  110. /// </summary>
  111. /// <param name="storedProcName">存储过程</param>
  112. /// <param name="parameters">IDataParameter参数</param>
  113. /// <returns></returns>
  114. public DataSet RunProcedure(string storedProcName, IDataParameter[] parameters)
  115. {
  116.     using (MySqlConnection connection = new MySqlConnection(this.connectString))
  117.     {
  118.         connection.Open();
  119.         MySqlCommand cmd = new MySqlCommand(storedProcName, connection);

  120.         cmd.CommandType = CommandType.StoredProcedure;
  121.         if (parameters != null)
  122.         {
  123.             foreach (MySqlParameter parameter in parameters)
  124.             {
  125.                 if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) &&
  126.                     (parameter.Value == null))
  127.                 {
  128.                     parameter.Value = DBNull.Value;
  129.                 }
  130.                 cmd.Parameters.Add(parameter);
  131.             }

  132.         }
  133.         using (MySqlDataAdapter da = new MySqlDataAdapter(cmd))
  134.         {
  135.             DataSet ds = new DataSet();
  136.             try
  137.             {
  138.                 da.Fill(ds, "ds");
  139.                 cmd.Parameters.Clear();
  140.             }
  141.             catch (MySql.Data.MySqlClient.MySqlException ex)
  142.             {
  143.                 throw new Exception(ex.Message);
  144.             }
  145.             return ds;
  146.         }
  147.     }

  148. }


  149. //调用存储过程返回DataSet结果集:
  150. public Dataset GetResultByProcedure(string ProcedureName, object[] parameters)
  151. {
  152.    MySqlParameter[] sqlParameters = GetMySQLParameters(ProcedureName,parameters);
  153.    DataSet ds= RunProcedure(ProcedureName, sqlParameters);
  154.    return ds;
  155. }
复制代码



实际使用:
如通过ID获取某城市信息,存储过程为Procedure_GetCityByID,参数为ID,ID=1,则:
Dataset ds=GetResultByProcedure("Procedure_GetCityByID",1)

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|nagomes  

GMT+8, 2025-5-5 01:32 , Processed in 0.023850 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表