精华内容
下载资源
问答
  • 在码农的生活中,很多级码农都这样的经历,会被一个小小的技术问题拦住,然后进度跟不上了,被老板XXXX一大通了。心情不爽了。 好吧,这个曾经是我遇到拦路虎之一。但事实上不是什么大技术。技术就是一层纸,破了...
  • VB.NET机房重构】数据传递----实体、DataTable、泛型

    千次阅读 热门讨论 2015-06-11 21:17:59
    泛型是程序设计语言的一特性。泛型结合类可以将类型参数用做它所存储的对象的类型的占位符。类型参数作为其字段的类型和其方法的参数类型出现。这样说可能有些抽象,那就从最开始的实体来举例吧。 一直不能理解我...

            一直不能理解我用着实体好好地,为什么非要换成DataTable,问别人的结果是:因为泛型特别好使。我就纳闷了,这又跟泛型有什么关系。问了好多都不是我要的结果,牛角尖上来了,那就自己搜索资料理解吧。

    首先说:为什么要用实体?

             对于大量的数据来说,还向VB版机房收费那样定义变量做参数显然是不合适的,一些简单的窗体还好,如登录窗体,就两个字段;要是换做注册窗体,起码得有十几个变量,很容易造成参数匹配上的错误,而且每次增删改查还要传递十几个参数,简直是麻烦透了。

              为此,我们引入了实体。实体对应的不是数据库中的单个字段,而是整张表。通过抽象封装,将每个表中的字段作为一个类的属性封装在指定的一个实体中。这样传递数据的时候,我们只传递一个实体就可以啦,当你需要哪个字段的时候,通过get()set()就可以啦,这样明显比一大堆参数飘来飘去整齐的多,灵活性增强,安全性增强,便于维护和拓展。(当然,如果是一两个字段,那传参数和传实体是一样的啦)

    再说:DataTable

              一直以为实体是对变量型参数的升级,而DataTable是对实体的升级。其实大错特错。其实用过DataTable之后就会感觉出来,DataTable是一个虚拟表,这个表跟数据库的紧密相当密切,虚拟表中的每个字段分别对应每个数据库表中的字段。而DataTable跟实体有什么联系呢?从数据库中查到的数据其实是默认存放到DataTable虚拟表中的,我们知道了实体的好处,所以通过反射将DataTable中的字段封装成实体对象后返回。换句话来说,实体的来源就是DataTable进行属性的反射得到的。所以,从面向对象角度说,实体是DataTable的升级。DataTable是一个虚拟表,更致力于表中的字段,可以直接进行字段的运算啊什么的比较方便,字段操作的灵活性比较强,性能比较好。

    最后说:为什么使用泛型?

             泛型结合类可以将类型参数用做它所存储的对象的类型的占位符。类型参数作为其字段的类型和其方法的参数类型出现。这样说可能有些抽象,用图来表示吧。个人觉得这张图最好不过,就直接引用不做修改了。


            可以说,泛型是在实体上进一步的封装,以实体为参数形成集合。这样一个泛型集合中,就可以最大容量的反应数据库,可以方便多张表的操作。

           以简单的BasicData表的查询为例。首先写一个DataTable转换成泛型的类:ConvertHelper。代码如下:

    Imports System.Collections.Generic  '增加泛型的命名空间    
    Imports System.Reflection '引入反射  
    Public Class ConvertHelper
        '将datatable转化为泛型集合    
        Public Shared Function convertToList(Of Turn As {New})(ByVal dt As DataTable) As IList(Of Turn)
            'convertToList(Of Turn As {New}) 这里的new是用来约束T的   
    
            Dim myList As New List(Of Turn)   '定义最终返回的集合    
            Dim myTpye As Type = GetType(Turn) '得到实体类的类型名    
            Dim dr As DataRow   '定义行集    
            Dim tempName As String = String.Empty   '定义一个临时变量    
    
            '遍历DataTable的所有数据行    
            For Each dr In dt.Rows
    
                Dim myTurn As New Turn    '定义一个实体类的对象    
                Dim propertys() As PropertyInfo = myTurn.GetType().GetProperties()  '定义属性集合    
                Dim Pr As PropertyInfo
    
                '遍历该对象的所有属性    
                For Each Pr In propertys
                    tempName = Pr.Name '将属性名称赋值给临时变量    
                    If (dt.Columns.Contains(tempName)) Then     '将此属性与datatable里的列名比较,查看datatable是否包含此属性    
                        '判断此属性是否有Setter    
                        If (Pr.CanWrite = False) Then   '判断此属性是否可写,如果不可写,跳出本次循环    
                            Continue For
                        End If
                        Dim value As Object = dr(tempName)  '定义一个对象型的变量来保存列的值    
                        If (value.ToString <> DBNull.Value.ToString()) Then '如果非空,则赋给对象的属性    
                            Pr.SetValue(myTurn, value, Nothing)    '在运行期间,通过反射,动态的访问一个对象的属性    
                        End If
                    End If
                Next
                myList.Add(myTurn)   '添加到集合    
            Next
            Return myList   '返回实体集合    
        End Function
    End Class
    
    具体的D层调用如下:

         ''' <summary>
        ''' 查询BasicData并显示
        ''' </summary>
        ''' <param name="basicdataentity"></param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Function SelectBasicData(ByVal basicdataentity As Entity.BasicDataEntity) As List(Of Entity.BasicDataEntity)
            Dim sql As New SQLHelper.SqlHelper
            Dim dt As DataTable
            Dim mylist As List(Of Entity.BasicDataEntity)
    
            Dim strsql As String = "Select * from BasicData " '定义SQL语句
    
            dt = sql.ExecSelectNo(strsql, CommandType.Text)
            mylist = ConvertHelper.convertToList(Of Entity.BasicDataEntity)(dt)
            Return mylist
        End Function
    小结:

             从DataTable到实体,再到泛型,一步一步更接近面向对象。但是具体怎么用,用什么,三个数据传递方式各有千秋。


    展开全文
  • Asp.Net MVC中的@model与Model讲解了后台控制器如何向前台页面传递数据,今天就接着为大家讲解前台View页面向后台Controller控制器传递数据的几种方式。这几种方式是我在实际中使用并总结的,如果那个地方说的不对或...

    https://blog.csdn.net/ydm19891101/article/details/44336951

    上一篇文章 Asp.Net MVC中的@model与Model讲解了后台控制器如何向前台页面传递数据,今天就接着为大家讲解前台View页面向后台Controller控制器传递数据的几种方式。这几种方式是我在实际中使用并总结的,如果那个地方说的不对或有不足之处,欢迎各位指出并给出建设性意见、共同学习。

    1、异步方式

    在实际项目开发中,我们经常需要异步提交数据,可以在不提交当前页面的时候即获取到一些重要信息。这样既不会浪费网络资源,也不会造成服务器负载。异步方式主要有ajax、post、get三种

    (1)ajax方式

    [javascript]  view plain  copy
    1. /*判断用户是否已经登录*/  
    2.         $(function () {  
    3.             $.ajax({  
    4.                 type: "post",  
    5.                 url: "/MonthWin/Index/12",  
    6.                 data:{"name":name,"sex":sex},  
    7.                 dataType: 'JSON',  
    8.                 success: function (result) {  
    9.                     if (result == true) {  
    10.                         isLogin = true;  
    11.                     }  
    12.                     else {  
    13.                         isLogin = false;  
    14.                     }  
    15.                 }  
    16.             });  
    17.         })  

    (2)post方式

    [javascript]  view plain  copy
    1. $.post(url, { "username": username, "province": province, "city": city, "branch": branch, "number": number, "bankName": bankName },  
    2.                function (result) {  
    3.                    if (result == "1") {  
    4.                        alert("保存成功");  
    5.                        location.reload();  
    6.                    }  
    7.                    else {  
    8.                        alert("保存失败");  
    9.                        location.reload();  
    10.                    }  
    11.                });  

    总结:异步方式实现起来也比较简单,当然这只是一方面。其最重要的一点就是可以回传值。我们可以根据后台传过来的值进行下一步的操作,同时减少了一次服务器请求,降低了网络负载。

    2、表单方式

    (1)post方式

    <1>不通过js,直接提交的post方式

    [html]  view plain  copy
    1. <form onsubmit="layer.load('请求提交中')" action="/WithFunding/StartFunding/12" method="post">  
    2. <input type="hidden" name="CategoryId" value="12" />  
    3. <input type="hidden" name="accountMoney" value="@ViewBag.Account" />  
    4. <input type="hidden" name="totalFreezeMoney" value="@ViewBag.totalFreezeMoney" />  
    5. <input type="hidden" name="totalWithFunding" value="@ViewBag.totalWithFunding" />  
    6. <input type="hidden" name="totalDepositMoney" value="@ViewBag.totalDepositMoney" />  
    7. <input type="hidden" name="moneyDeposit" value="@ViewBag.moneyDeposit" />  
    8. <input type="hidden" name="moneyWithfunding" value="@ViewBag.moneyWithfunding" />  
    9. <input type="hidden" name="rateOpen" value="@ViewBag.rateOpenLine" />  
    10. <input type="hidden" name="rateWarn" value="@ViewBag.rateWarn" />  
    11. <input type="hidden" name="defaultManageMoney" value="@ViewBag.defaultManageMoney" id="manageMoney" />  
    12. <input type="hidden" name="startTime" value="@ViewBag.startTime" />  
    13. <input type="hidden" name="ManageFeeRate" value="@ViewBag.moneyRate" />  
    14. <input type="hidden" name="days" id="days" />  
    15. <input type="button" onclick="history.go(-1)" value="返回修改" class="btn2" />  
    16. </form>  

    <2>使用js提交的post方式

    [javascript]  view plain  copy
    1. /*修改银行卡*/  
    2. function updateBank() {  
    3.     var username = $.trim($("#username").val());  
    4.     var branch = $.trim($("#branch").val());  
    5.     var number = $.trim($("#changbankno").val());  
    6.     var check = /^(\d{19})$/;  
    7.     var bankName = $("#addBankCode").find("option:selected").text();  
    8.     if (username == "" || username == null) {  
    9.         alert("请输入开户名");  
    10.     }  
    11.     else if (branch == "" || branch == null) {  
    12.         alert("请输入开户支行");  
    13.     }  
    14.     else if (number == "" || number == null) {  
    15.         alert("请输入银行卡号");  
    16.     }  
    17.     else if (!check.test(number)) {  
    18.         alert("请输入正确的银行卡格式");  
    19.     }  
    20.     else if (bankName == "请选择银行") {  
    21.         alert("请选择银行");  
    22.     }  
    23.     else {  
    24.         $("#Updatebank").submit();  
    25.     }  
    26. }   

    上面介绍的两种form表单提交方式只能简单的向后台提交数据,至于数据提交之后服务器的返回值,我们是看不到的。为了得到相应结果,我们还需要在后台添加代码。这个在此就不再累述了。

    总结:从上面的代码我们可以看到post传值方式可以传递的数据量几乎不受限制,如果需要大量的传值,post方式是一个不错的选择。

               

    
    

    (2)get方式

    表单提交的get方式也可以称为QueryString方式,就是简单的把要传递的数据放在Url之后。

    [html]  view plain  copy
    1. <form onsubmit="layer.load('请求提交中')" action="/WithFunding/StartFunding/12?id=123" method="get"></form>  

    总结:不过get方式相比post的方式有很多不足:传递数据量有限制、不安全

    当然在MVC中我们还可以通过HTML帮助器实现表单提交,在此不在累述,具体请参考:MVC学习系列-HTML帮助器的使用

    3、异步表单方式

    [javascript]  view plain  copy
    1. <head>   
    2.     <script type="text/javascript" src="path/to/jquery.js"></script>   
    3.     <script type="text/javascript" src="path/to/form.js"></script>   
    4.    
    5.     <script type="text/javascript">   
    6.         // wait for the DOM to be loaded   
    7.         $(document).ready(function() {   
    8.             // bind 'myForm' and provide a simple callback function   
    9.             // 为myform绑定ajaxForm异步提交事件,并提供一个简单的回调函数。  
    10.             $('#myForm').ajaxForm(function() {   
    11.                 alert("Thank you for your comment!");   
    12.             });   
    13.         });   
    14.     </script>   
    15. </head>  
    总结:这种方式是前两种方式的结合使用,当然也就结合了两者的优点,比较方便

    4、Model数据存储模型方式

    MVC 中的Model作为Controller和View之间交流的桥梁,当然也就可以在View和controller之间传递数据。该方式的实现主要分为以下三步:

    (1)定义Model实体

    [csharp]  view plain  copy
    1. public class Model  
    2.     {  
    3.         public string rtoNumber { setget; }  
    4.         public string approver { setget; }  
    5.         public string modifier { setget; }  
    6.         public string comment { setget; }  
    7.     }  

    (2)定义Html标签

    [html]  view plain  copy
    1. <div id="container">  
    2.         <table id="table">  
    3.             <tr>  
    4.                 <td><label>RTONumber</label><input name="rtoNumber" /></td>  
    5.                 <td><label>Approver</label><input name="approver" /></td>  
    6.                 <td><label>Modifier</label><input name="modifier" /></td>  
    7.                 <td><label>Comment</label><textarea name="comment" cols="30" rows="4"></textarea></td>  
    8.             </tr>  
    9.         </table>  
    10.         <input id="submit" type="button" value="submit"/>  
    11. </div>  

    (3)传值

    [javascript]  view plain  copy
    1. <script type="text/javascript">  
    2.         $(function () {  
    3.             $('#submit').click(function () {  
    4.                 var model = [];  
    5.                 var subModel = [];  
    6.                 $.each($("table tr"), function (i, item) {  
    7.                     var RTONumber = $(item).find("[name=rtoNumber]").val();  
    8.                     var Approver = $(item).find("[name=approver]").val();  
    9.                     var Modifier = $(item).find("[name=modifier]").val();  
    10.                     var Comment = $(item).find("[name=comment]").val();  
    11.                     model.push({ rtoNumber: RTONumber, approver: Approver, modifier: Modifier, comment: Comment, checkBoxValue: subModel });  
    12.                 });  
    13.                 $.ajax({  
    14.                     url: '/WithFunding/StartFunding',  
    15.                     data: JSON.stringify(model),  
    16.                     type: 'POST',  
    17.                     contentType: 'application/json;charset=utf-8',  
    18.                     async: false,  
    19.                     success: function (data) {  
    20.                         alert("Postting data is over!");  
    21.                     }  
    22.                 });  
    23.             });  
    24.         });  
    25. </script>  
    总结:在数据存储模型传值方式中,我们也采用了ajax异步方式。然而此种方式与ajax方式又有一些不同:传递的数据是Model实体类型。相信大家也看到了,虽然Model可以实现View传值到Controller,但是代码量比较大,而且不太好理解,所以在实际中我们使用的不多。

    5、Url 路由方式

    MVC开发方式中,我们请求的是控制器下面的一个Action,有时候Action需要参数,也就是路由参数。我们通过添加路由规则传递路由参数。

    [csharp]  view plain  copy
    1. public static void RegisterRoutes(RouteCollection routes)  
    2. {  
    3.     routes.IgnoreRoute("{resource}.axd/{*pathInfo}");  
    4.   
    5.     routes.MapRoute(  
    6.         "Default"// Route name  
    7.         "{controller}/{action}/{id}"// URL with parameters  
    8.         new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults  
    9.     );  
    10. }  
    Url 路由传值方式如下所示

    [javascript]  view plain  copy
    1. http://localhost:39901/UserPay/Withdraw/12  
    上面的12就是路由参数,对应的Action如下所示
    [csharp]  view plain  copy
    1. public ActionResult Withdraw(int id)  
    2. {  
    3.     int Cid = 0;  
    4.     var Mid = WebHelper.GetCookie(StockFunds.Key.CookieKey.MemberId);//用户Id  
    5.     if (!string.IsNullOrWhiteSpace(Mid))   
    6.     {  
    7.        Cid= Convert.ToInt32(SecureHelper.AESDecrypt(Mid));  
    8.     }  
    9.     string Username = Request["username"];  
    10.     string province = Request.Form["province"];  
    11.     string city = Request["city"];  
    12.     string branch = Request["branch"];//支行  
    13.     string number = Request["number"];//卡号  
    14.     string bankName = Request["bankName"];//开户银行  
    15.     F_Member_Banks bank = new F_Member_Banks();  
    16.     bank.BankName = bankName;  
    17.     bank.BankNo = number;  
    18.     bank.MId = Cid;  
    19.     bank.CardHolder = Username;  
    20.     bank.AddDate = System.DateTime.Now;  
    21.     bank.AccountBranck = branch;  
    22.     var res = BLL.F_MemberBLL.GetMember.BandBinding(bank).ToString();  
    23.     return Content(res);  
    24. }  

    总结:Url 路由方式传值方式的数据量很有限,不适于大数据量的传递。

    上面只是讲解了前台向后台传值的几种方式,具体后台如何接受数据就不再说明了。希望对大家有帮助。



    展开全文
  • 在编写数据库应用程序时,...本文介绍在VB中动态加载ODBC数据源的两种方法。方法之一:修改注册表一般情况下,用户在控制面板中配置好ODBC数据源后,Windows系统会将用户配置的信息写在注册表中。当应用程序需要用...

    在编写数据库应用程序时,常常需要用户自己在控制面板中配置ODBC数据源。然而对一般用户而言,配置ODBC数据源的工作是有一定困难的。因此,如果能在程序中动态加载ODBC数据源,就能大大方便应用程序最终用户的使用。本文介绍在VB中动态加载ODBC数据源的两种方法。

    方法之一:修改注册表

    一般情况下,用户在控制面板中配置好ODBC数据源后,Windows系统会将用户配置的信息写在注册表中。当应用程序需要用到数据源时,Windows会通知底层接口查阅注册表中该数据源的配置。例如,如果配置了系统数据源,Windows系统会根据配置修改注册表中的 HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI 主键。因此,我们只要在应用程序中使用API函数来完成Windows对注册表所做的工作,就可以达到动态加载数据源的目的。

    对于不同类型的数据源,注册表修改的内容也会各有不同,但基本上都要修改两个地方:一个是在ODBC.INI子键下建立与数据源配置相关的项;另一个是在\ODBC.INI\ODBC Data Source子键下建立一个新项,以告诉驱动程序管理器ODBC数据源的类型信息。

    下面以配置一个ODBC系统数据源为例,给出一段动态加载Access数据源的VB例程:

    Public Function LoadDbSource(StrSourceName, StrSourceDB, StrDescription As String) As Boolean

    Dim hKey As Long '要打开的注册表键句柄

    Dim lReturn As Long '注册表API函数的执行返回值

    Dim StrSubKey As String '要打开的子键

    Dim Buffer As String * 255

    Dim StrSysDir As String

    Dim StrDbq, StrDriver, StrFil, StrUid As String

    Dim LngDriverID, LngSafeTransactions As Long

    Dim StrImplict, StrUserCommit As String

    Dim LngPageTimeout, LngThreads, LngMaxBufferSize As Long

    Dim StrDbType As String

    '检测是否安装 Access ODBC 驱动 odbcjt32.dll

    lReturn = GetSystemDirectory(Buffer, 255)

    StrSysDir = Left(Buffer, lReturn) '获取Windows系统目录

    StrDriver = StrSysDir & "\odbcjt32.dll"

    If Dir(StrDriver) = "" Then

    MsgBox "您的计算机中没有安装Access的ODBC驱动程序odbcjt32.dll,无法加载数据源。", vbOKOnly + vbCritical

    LoadDbSource = False

    Exit Function

    End If

    StrSubKey = "SOFTWARE\ODBC\ODBC.INI" & "\" & StrSourceName

    lReturn = RegCreateKey(HKEY_LOCAL_MACHINE, StrSubKey, hKey)

    If lReturn <> ERROR_SUCCESS Then

    LoadDbSource = False

    Else

    StrDbq = StrSourceDB

    LngDriverID = 25

    StrFil = "MS Access;" '文件类型"MS Access" for Microsoft Access

    LngSafeTransactions = 0

    Call RegSetValueEx(hKey, "DBQ", 0&, REG_SZ, StrDbq, LenB(StrDbq))

    Call RegSetValueEx(hKey, "Description", 0&, REG_SZ, StrDescription, LenB(StrDescription))

    Call RegSetValueEx(hKey, "Driver", 0&, REG_SZ, StrSourceDB, LenB(StrSourceDB))

    Call RegSetValueEx2(hKey, "DriverID", 0&, REG_DWORD, LngDriverID, 4)

    Call RegSetValueEx(hKey, "FIL", 0&, REG_SZ, StrFil, LenB(StrFil))

    Call RegSetValueEx(hKey, "UID", 0&, REG_SZ, "", LenB(""))

    Call RegSetValueEx2(hKey, "SafeTransaction", 0&, REG_DWORD, LngSafeTransactions, 4)

    Call RegCloseKey(hKey)

    StrSubKey = StrSubKey & "\Engines\Jet"

    lReturn = RegCreateKey(HKEY_LOCAL_MACHINE, StrSubKey, hKey)

    If lReturn <> ERROR_SUCCESS Then

    LoadDbSource = False

    Else

    StrImplict = ""

    StrUserCommit = "Yes"

    LngPageTimeout = 5

    LngThreads = 3

    LngMaxBufferSize = 2048

    Call RegSetValueEx(hKey, "ImplictCommitSync", 0&, REG_SZ, StrImplict, LenB(StrImplict))

    Call RegSetValueEx2(hKey, "MaxBufferSize", 0&, REG_DWORD, LngMaxBufferSize, 4)

    Call RegSetValueEx2(hKey, "PageTimeout", 0&, REG_DWORD, LngPageTimeout, 4)

    Call RegSetValueEx2(hKey, "Threads", 0&, REG_DWORD, LngThreads, 4)

    Call RegSetValueEx(hKey, "UserCommitSync", 0&, REG_SZ, StrUserCommit, LenB(StrUserCommit))

    Call RegCloseKey(hKey)

    '设置ODBC数据库引擎名称

    lReturn = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources", 0&, KEY_WRITE, hKey)

    If lReturn <> ERROR_SUCCESS Then

    LoadDbSource = False

    Else

    StrDbType = "Microsoft Access Driver (*.mdb)"

    lReturn = RegSetValueEx(hKey, StrSourceName, 0&, REG_SZ, StrDbType, LenB(StrDbType))

    If lReturn = ERROR_SUCCESS Then LoadDbSource = True

    End If

    End If

    End If

    End Function

    在上面的程序中使用了标准的Win32 API注册表操作函数,在VB "API文本浏览器"工具和MSDN中可以很容易查到其详细说明。

    方法之二:使用ODBC DLL提供的函数

    Windows系统目录中提供有一系列专门操作ODBC的动态链接库,其中Odbcinst.dll提供了一个可以动态的增加、删除和修改数据源的函数SQLConfigDataSource()。微软在MSDN的帮助文档中提供了对该函数的详细使用说明:

    BOOL SQLConfigDataSource(

    HWND hwndParent,

    WORD fRequest,

    LPCSTR lpszDriver,

    LPCSTR lpszAttributes);

    其中:hwndParent为调用窗体句柄;fRequest为操作码,通过设置不同的值可以实现对数据源的增加、删除、修改操作,这些对应值可以在MSDN中查到;lpszDriver参数传递数据库引擎,lpszAtrributes是配置信息列表,配置信息条目之间以字符代码Chr(0)分隔。同样,我们以上面的Access数据源配置为例写一个标准函数:

    Private Const ODBC_ADD_SYS_DSN = 4

    Private Declare Function SQLConfigDataSource Lib "odbccp32.dll" (ByVal hwndParent As Long, ByVal fRequest As Long, ByVal lpszDriver As String, ByVal lpszAttributes As String) As Long

    Public Function LoadDbSource2(StrDriver, StrAttributes As String) As Boolean

    LoadDbSource2 = SQLConfigDataSource(0&, ODBC_ADD_SYS_DSN, StrDriver, StrAttributes)

    End Function

    在VB程序中调用这个标准例程:

    Dim StrAttributes As String

    StrAttributes = "DSN=AccessODBC2" & Chr(0) & "Desciption=动态加载ODBC示例" & Chr(0)

    StrAttributes = StrAttributes & "Dbq=" & App.Path & "\MyDb.mdb" & Chr(0) & "FIL=MS Access;" & Chr(0)

    StrAttributes = StrAttributes & "MaxBufferSize=2048" & Chr(0) & "PageTimeout=5" & Chr(0)

    Call LoadDbSource2("Microsoft Access Driver (*.mdb)", StrAttributes)

    上述两种方法都可以实现VB动态加载ODBC数据源,对于不同类型的数据源,注册表中记录的内容会有一些不同。所以,除查阅有关文档外,程序员可以先通过手工在控制面板中配置数据源,然后再通过观察注册表中的内容再进行编程。

    展开全文
  • 最近在开发一个项目,在实现某个模块数据的插入操作时(底层数据库的交互采用的是EF),发现无论如何数据都不能插入成功,把数据拷贝出来放到数据库中执行Sql语句时却能正确插入,下面给出代码片段 public int ...

    最近在开发一个项目,在实现某个模块数据的插入操作时(底层数据库的交互采用的是EF),发现无论如何数据都不能插入成功,把数据拷贝出来放到数据库中执行Sql语句时却能正确插入,下面给出代码片段

     public int InsertWithFundInfo(F_WithFunding_Info withinfo)
            {
                int res = 0;
                using (var context = new RenRenChaoContext())
                {
                    context.F_WithFunding_Info.Attach(withinfo);
                    return res = context.SaveChanges();
                }
            }
    核心也就是两段代码,就是不知道问题出在了哪里。后来想起EF插入数据还有一个Add方法,于是抱着侥幸的心理试了试,结果竟然成功了。

     public int InsertWithFundInfo(F_WithFunding_Info withinfo)
            {
                int res = 0;
                using (var context = new RenRenChaoContext())
                {
                    context.F_WithFunding_Info.Add(withinfo);
                    //context.F_WithFunding_Info.Attach(withinfo); return res = context.SaveChanges();
    }
     
    

    在网上搜了一番,发现虽然两者都可以用来插入数据,不过还是有一些细微的差别。

    在讲解差别之前,我们先来看下命名空间下的描述实体所处状态的枚举类型EntityState:

        // 摘要:
        //实体对象的状态。
        [Flags]
        public enum EntityState
        {
            // 摘要:
            //     对象存在,但未由对象服务跟踪。在创建实体之后、但将其添加到对象上下文之前,该实体处于此状态。通过调用 System.Data.Objects.ObjectContext.Detach(System.Object)
            //     方法从上下文中移除实体后,或者使用 System.Data.Objects.MergeOption.NoTrackingSystem.Data.Objects.MergeOption
            //     加载实体后,该实体也会处于此状态。
            Detached = 1,
            //
            // 摘要:
            //     自对象加载到上下文中后,或自上次调用 System.Data.Objects.ObjectContext.SaveChanges() 方法后,此对象尚未经过修改。
            Unchanged = 2,
            //
            // 摘要:
            //     对象已添加到对象上下文,但尚未调用 System.Data.Objects.ObjectContext.SaveChanges() 方法。对象是通过调用
            //     System.Data.Objects.ObjectContext.AddObject(System.String,System.Object)
            //     方法添加到对象上下文中的。
            Added = 4,
            //
            // 摘要:
            //     使用 System.Data.Objects.ObjectContext.DeleteObject(System.Object) 方法从对象上下文中删除了对象。
            Deleted = 8,
            //
            // 摘要:
            //     对象已更改,但尚未调用 System.Data.Objects.ObjectContext.SaveChanges() 方法。
            Modified = 16,
        }<p></p>

    这五种状态分别是:Detached-游离;UnChanged-没有变化;Added-添加;Deleted-删除;Modified-编辑。Detached状态下的Entity不会被上下文(context)所捕获(track)。当SavaChanged()方法执行期间,他会查看当前Entity的EntityState的值,决定是去新增(Added)、修改(Modified)、删除(Deleted)、什么也不做(UnChanged)。

    1.Attach()

    Attach在 微软的中文翻译中是附加,不同于Add方法的添加,她是将一个处于Detached的Entity附加到上下文,而附加到上下文后的这一Entity的State为UnChanged。传递到Attach方法的对象必须具有有效的EntityKey值。如果该对象不具有有效的EntityKey值,请使用AttachTo方法指定实体集的名称。

    2、Add()

    MSDN的解释:Add方法将对象将一个对象添加到集合中,添加到EntityCollection并创建两个对象之间的关系。当源对象附加到ObjectContext实例时,方法也将对象添加到ObjectContext当调用SaveChanges时,此操作转换为插入到数据源中的操作。

    自我理解:ObjectContext类的Add()方法的作用就是将一个Entity的State修改为Added,这样在SavaChanged()方法就会将实体新增到数据库当中

    这样,在上面的程序中通过调用Attach()方法只能把对象添加到了对象上下文中(此时对象的状态已经是Unchanged的),执行SaveChange()方法并不能真正添加到数据库中去。要想真正执行还需要添加一个修改实体状态的代码。

    context.ObjectStateManager.ChangeObjectState(withinfo,EntityState.Added);  

    调用Add()方法时其实已经隐藏了修改实体的状态为Added的这个操作,执行SaveChange()方法就可以进行新增的操作。

    Linq to EF 增删改查这篇文章中添加数据介绍了两种方法的具体使用有兴趣的可以参考一下。


    参考文献:https://msdn.microsoft.com/zh-cn/library/system.data.objects.objectcontext.attach(v=vs.110).aspx

                    https://msdn.microsoft.com/zh-cn/library/system.data.objects.objectcontext.addobject(v=vs.110).aspx

                    https://msdn.microsoft.com/zh-cn/library/bb351713(v=vs.110).aspx

                    http://www.cnblogs.com/Jnw-qianxi/archive/2013/08/15/3260989.html

    展开全文
  • 种VB窗体之间简单的参数传递方法

    千次阅读 2008-09-04 14:57:00
    假设有两个窗体 form1 和form2,form1打开form2时必须将一个值传递给form2,实现该参数传递的方法如下: 首先在form2定义一个变量,如下 public nt as string 然后在form1中给该变量赋值,如下 form2.nt="aaa" ...
  • VB自定义类型参数的传递

    千次阅读 2012-07-08 21:12:06
    这里介绍VB自定义类型参数的传递,用户自定义类型在VB中是一重要的数据类型,它为编程者提供了很大的灵活性,使开发人员可以根据需要构造自己的数据结构。 AD: 本文向大家介绍VB自定义类型参数...
  • vb函数参数的传递

    万次阅读 2005-06-16 12:18:00
    实际上,形参的完整的语法格式应该为:[[Optional][ByVal|ByRef]|ParamArray] > [()][As 类型>][=缺省值>]ByVal表示该参数按值传递,简称值参。此时形参与实参各占一个独立的存储空间,形参的存储空间是调用时才分配...
  • 本文主要介绍VC与Matlab混合编程的两种方法,并详细介绍了VC向Matlab传递复杂数据:结构体的方法,详细代码说明。Matlab 主要面对科学计算、可视化以及交互式程序设计的高科技计算环境,但由于Matlab开发平台上...
  • VB模拟键盘输入的N方法

    千次阅读 2017-10-17 09:01:25
    VB模拟键盘事件的N方法 键盘是我们使用计算机的一个很重要的输入设备了,即使在鼠标大行其道的今天,很多程序依然离不开键盘来操作。但是时候,一些重复性的,很繁琐的键盘操作总会让人疲惫,于是就了用...
  • MYSQL存储过程VB调用方法。Private Sub Command1_Click()Dim MyComm As New ADODB.Command '定义一个命令对象Dim Rs_GetList As New ADODB.Recordset '定义一个记录集对象Dim param As ADODB.Parameter '定义一个...
  • 如:VB :默认为地址传递,可以指定用值传递C: 普通方式实现值传递,指针方式实现地址传递C++:比 C 多了引用传递,本质上是地址传递Fortran: 默认为地址传递,可以指定使用值传递两种传递方式的区别:1....
  • c#&vb两种语言语法的简要介绍

    千次阅读 2008-09-04 23:07:00
    c#&vb两种语言语法的简要介绍1.变量声名 C# 语法 int x; String s; String s1, s2; Object o; Object obj = new Object(); public String name; VB语法 Dim x As Integer Dim s As String Dim s1, s2 As String Dim ...
  • VB.NET机房重构】DataGridView数据显示

    千次阅读 热门讨论 2015-06-07 19:14:31
    VB.net中,DataGridView控件用到的次数不少,当然这个控件也的确是个强大的控件,不用我们写代码即可查询并显示数据。下面来介绍一下。 一、单纯显示数据(以“值班记录查询”窗体为例) 方案一: ...
  • 实际开发运用过程中,往往需要将页面上的一些表格数据生成Excel供用户下载使用,根据不同的需求,此处整理了两种方式:(两种方式浏览器都可直接提示下载或保存文件) 方式一: 1、需求: 生成的Excel跟页面上...
  • 入门:一个简单的VB.NET程序结构2.VB.NET的基本数据类型3.VB.NET中的类型转换函数4.Shared(共享)修饰符和Static(静态)修饰符的区别5.VB.NET中常量和枚举类型的声明6.VB.NET声明语句7.VB.NET指令8.VB.NET流程控制...
  • 动态添加ODBC数据源的两种方法

    千次阅读 2014-11-20 19:34:21
    在使用 VC、 VB、 Delphi等高级语言编写数据库应用程序时,往往需要用户自己在控制面板中配置 ODBC数据源。...为能在程序中完成这一工作,方便应用程序的使用,本文以 VC为开发环境介绍两种在应用程序中动态加载 ODBC
  • VC++ 与VB 数据类型对应关系

    千次阅读 2013-12-23 03:47:49
     在做VC与vb程序间互相调用,需要注意两种语言不同编译器对数据类型的定义区别,此时两者数据类型的对应关系就显得十分的重要,对应关系以及声明方式如下所示。 VC++ VB short ...
  • vb中函数的调用与参数的传递

    千次阅读 2010-12-14 20:54:00
    <br />形参如果是数组必须加小括号 如:定义过程 sub em( pay() as Single) 调用过程 em(xu()) 按值传递(ByVal):形参和实参占有不同的存储空间,调用过程改变了形参变量的值,实参的值...
  •   vb6中存在几个虚幻的值:Null、Missing、Empty、Nothing、vbNullString。除了最后一个之外,每一个值都不能直接用...这种数据通常出现在三情况下: (1)最简单的,函数直接返回Null给调用方。譬如 Function ...
  • Javabean 就是为了和 jsp 页面传数据化简交互过程而产生的。 自己的理解: 使用 javabean 和不用 javabean 的区别: 一个 javabean 就是为 jsp 页面上的元素一一开辟一个空间,然后根据需要赋值、读值。而如果不用 ...
  • 在《VB.NET学习笔记:窗体显示及互相传值》一文中,通过默认的窗体实例、保持窗体引用的全局性或在窗体构造函数中把窗体指针作为参数传递,这些方法都是直接操作窗体中的任何控件来读取和改变窗体内的信息。...
  • 本文介绍了一实现VB调用C语言程序的方法-动态链接库方法,给出了动态链接库生成的一般框架,并通过示例描述了动态链接库的实现及其制造方法和编程步骤. 该方法具有普遍意义. 关键字VB动态链接库DLL C程序1.简介...
  • 在 Visual Basic 6.0 中, Any类型的变量通常用于传递是字符串或 Null 的变量, 您可以通过声明两种(一种使用长型,一种使用字符串)来替换这种 Visual Basic 6.0 的用法。 易语言的函数、类型、常数声明是放在不同的...
  • application/json 四常见的 POST 提交数据方式

    万次阅读 多人点赞 2018-11-13 16:00:11
    application/json 四常见的 POST 提交数据方式 转载声明: 本文系转载自以下篇文章: 四常见的 POST 提交数据方式 作者: 沧海一滴 转载仅为方便学习查看,一切权利属于原作者,本人只是做了整理和排版,...
  • 本人菜鸟,这篇文章纯属个人记录,主要功能是通过 java 和 Ireport ...主报表下面多个子报表组成 (A4:: 842*595) 设置 Page width 和 Page height 为 595*842,则当前报表会填满一页 通过设置 属性 - Margins-Left
  • Javabean 就是为了和 jsp 页面传数据化简交互过程而产生的。自己的理解:使用 javabean 和不用 javabean 的区别:一个 javabean 就是为 jsp 页面上的元素一一开辟一个空间,然后根据需要赋值、读值。而如果不用 ...
  • 前言 在《VB/VBA,请让我点名表扬你》一文中指出,立身于教育的Kemeny和Kurtz教授,以其宽广的胸怀赋予BASIC和其继任者宽容的做派...1、有种懒叫VB,你不懂! 不声明变量,就可随意而为,在其他强类型的语言里简直不.
  • VB.Net 个窗体之间的传值及修改

    万次阅读 热门讨论 2013-11-26 01:07:51
    在做机房收费系统,遇到这样一个问题:在上下机...目前,我只学到了这两种方法。通过这次,发现了学习上的很大的弊端。 PS:崔师哥说,很简单不难,我用了N久,青峰帮忙分析了学习上的问题,还是收获颇丰的。  
  • VB基础

    千次阅读 2019-04-08 18:23:52
    VB基础 1、VB For循环 基本语法 For counter [ As datatype ] = start To end [ Step step ] [ statements ] [ Continue For ] [ statements ] [ Exit For ] [ statements ] Next [ counter ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 21,001
精华内容 8,400
关键字:

vb数据传递方式有两种