用别人的封装,不去理解获取会让人变笨, 关于c#存储过程参数 多

2024-06-25  本文已影响0人  吉凶以情迁

这本是一个很简单很简单的问题,但是经过别人层层封装,晕头转向,搞不懂为何搞那么多麻烦的操作。当时保持能用就不改动原则直接套用,后面随着 发现了一个巨大的bug。。。。学了太多语言的我不能忽视这个问题,让我不得不去看看c#原始api是怎么设置的,

参数设置

new SqlParameter("@XXX", SqlDbType.VarChar, 50, VALUE)

经常看到有这种,当然这玩意不是我写的,但是我是做安卓开发得吧别人c#窗体代码转c#接口,我保持能不动就不动的原则,就很尴尬,就这样搞出了很多问题,把a当做b 把b当做a,看起来简单的容易理解的东西但是却让人混淆了官方api的正确用法,【人家说我叫sourcecolumn,你说这叫值, 】
这种方法本身不对的,第4个 参数是sourcecolumn,
但是为啥可以,那是因为内部吧sourcecloumn赋值给了value,也是为了偷懒传参吧。

因此参数设置有很多种
另外 输入参数 不需要指定长度。

所以我这次 决定封装了一个扩展 ,更方便的把源列拷贝过去

 public static void AddAndSetValueByExtensions(this SqlParameterCollection collection, SqlParameter sqlParameter)
        {
            collection.Add(sqlParameter);
            if (sqlParameter.Value == null)//Value必须有,否则会导致提示参数为传递.
            {
                if (sqlParameter.SourceColumn != null)
                {
                    sqlParameter.Value = sqlParameter.SourceColumn;
                }
                else
                {
                    sqlParameter.Value ="";

                }
            }

        }
image.png

另外项目中大量适用了二次封装,存在各种奇奇怪怪的问题以及兼容问题 比如在.net core出现了内存被回收执行几行代码后再次读取数据丢失问题 ,对于别人项目的事情管不过来,我这边是采用原始简洁法。取参也方便。

下面的主要适用input参数的 以及,数据类型明确的。

            sqlCommand.Parameters.AddWithValue("@paramName","i am value"); 

            sqlCommand.Parameters.Add(new SqlParameter("@param", SqlDbType.VarChar, 50) { Value="i am value"}); 

取参数

sqlCommand.Parameters[^1] ...
sqlCommand.Parameters["参数名"]

而out,需要指定长度。
所以可以如下配置
new SqlParameter("@AA", SqlDbType.VarChar, 200) { Value="i am value",Direction = ParameterDirection.Output };

这也怪微软,简便的构造不弄,结果有人为了简便玩骚操作,层层多余封装,在我看来多此一举,

我为了把代码转接口,我也是保持能不动就不动原则
如下图,实际上,输出参数直接add即可,不需要单独去检测sourcecloumn拷贝到value ,但是因为把a当做b使用,


image.png
   new SqlParameter("@AA", SqlDbType.VarChar, 200) { Value="i am value",Direction = ParameterDirection.Output };
            new SqlParameter("@BB", SqlDbType.VarChar, 200,"SOOURCECOLUMN") { Value="i am value",Direction = ParameterDirection.Input };

构造第4个参数 SOOURCECOLUMN

需要注意的是,输出需要设置长度,输入可自动适应。

{Vaue =xx}的操作也非常适用于给某些类required修饰的字段,主要用不设置可空的字段。

上一篇下一篇

猜你喜欢

热点阅读