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

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

作者: 吉凶以情迁 | 来源:发表于2024-06-25 14:40 被阅读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修饰的字段,主要用不设置可空的字段。

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/rdhjcjtx.html