.Net Core使用ADO.NET实现增删改查

在同一个 Blazor 应用中结合 ADO.NET、EF Core 和 Dapper 我们将了解如何将 ADO.NET、EF Core 和 Dapper 与 Blazor 应用程序结合使用。我在同一个 Blazor 应用程序中结合了这三种不同的方法。这样,人们就可以从一个地方了解这些不同的方法。请注意,这是我在一篇文章中结合不同方法的一次实验性努力。ADO.NET 提供对数据源(例如 SQL Server 和 XML)以及通过 OLE DB 和 ODBC 公开的数据源的一致访问。数据共享消费者应用程序可以使用 ADO.NET 连接到这些数据源并检索、处理和更新它们包含的数据。 阅读详情

.net core 简单介绍:
.net core 是微软公司推出的一个跨平台 框架 他重写了Clr底层 屏蔽window 的依赖,可以运行window ,linux ,max等系统 效率比.net framework 要高出很多。
简单说明下.net core 的目录在这里插入图片描述
下面是我学习的时候 写的增删改查
先预览 下界面
在这里插入图片描述

1.控制器

using HomeMediaFileManageSystemUtilts.Sql;
using Microsoft.AspNetCore.Mvc;
using System.Data.SqlClient;

namespace NetCore.Controllers
{
    public class HomeController : Controller
    {



        
        public IActionResult Index()
        {

            return View();
        }


        /// <summary>
        /// 查询
        /// </summary>
        /// <returns></returns>
        public IActionResult GetUser()
        {
            //切换数据的语句
            //SqlHelper.SetConStr();
            var sql = @"SELECT* FROM(
                SELECT RID = ROW_NUMBER()  OVER(ORDER BY ID),*FROM STUDENT
                ) A
                WHERE A.RID BETWEEN   1  AND  20 AND A.STATUS=1";
            var ds = SqlHelper.ExecuteDataSetText(sql, null);
            return Json(ds);
        }

        /// <summary>
        /// 删除
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public string  DelUserById(int id) {
            var msg = default(string);
            var sql = "UPDATE  STUDENT  SET STATUS=0 WHERE  Id=@Id";
            SqlParameter[] parameters = new SqlParameter[] {
               new SqlParameter("@Id",id)
            };
           var  len=SqlHelper.ExecteNonQueryText(sql, parameters);
            if (len > 0)
            {
                msg = "删除成功";
            }
            else {
                msg = "删除失败";
            }
            return msg;
        }
        /// <summary>
        /// 根据Id查找
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public IActionResult GetUserById(int  id) {
            var sql = " SELECT  * FROM  STUDENT  WHERE  Id=@Id";
            SqlParameter[] parameters = new SqlParameter[] {
               new SqlParameter("@Id",id)
            };

           var ds= SqlHelper.ExecuteDataSetText(sql, parameters);
           return Json(ds);
        }
        /// <summary>
        /// 修改
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public string UpdateUserById(int id,string name,string school,int age) {
            string msg = string.Empty;
            var sql = "UPDATE   STUDENT  SET  Age=@age,Name=@Name,School=@School  WHERE ID=@ID";
            SqlParameter[] parameters = new SqlParameter[] {
               new SqlParameter("@Id",id),
                new SqlParameter("@Age",age),
                 new SqlParameter("@Name",name),
                  new SqlParameter("@School",school),
            };
            var len = SqlHelper.ExecteNonQueryText(sql, parameters);
            if (len > 0)
            {
                msg = "修改成功";
            }
            else
            {
                msg = "修改失败";
            }
            return msg;
        }

    }
}

2.视图


@{
    ViewData["Title"] = "Index";
}
<script src="~/lib/jquery/dist/jquery.js"></script>
<script src="~/js/Home.js"></script>
<style>
    #table {
        display: none;
    }

    td {
        height: 40px;
        text-align: center;
    }

    tr:hover {
        background-color: lightseagreen;
    }

    #mask-kk {
        position: absolute;
        top: 0;
        left: 0;
        width: 100%;
        height: 100%;
        z-index: 999;
        background: #666;
        opacity: 0.5;
        filter: alpha(opacity=50)-moz-opacity: 0.5;
        display: none;
    }

    .popup-kk {
        position: absolute;
        left: 50%;
        width: 400px;
        height: 300px;
        background: #fff;
        z-index: 1000;
        display: none;
        border-radius: 5px;
    }

    .layoutDiv {
        margin-top:20px;
    }
  
    .close {
        position: absolute;
        top: 21px;
        right: 20px;
        cursor: pointer;
    }

    
</style>
<center>
    <h2>.NET Core  增删改查</h2>
    <table border="1" cellpadding="0" cellspacing="0" style="width:1200px" id="table">
        <tr>
            <th>用户编号</th>
            <th>用户名</th>
            <th>年龄</th>
            <th>性别</th>
            <th>爱好</th>
            <th>学校</th>
            <th>身高</th>
            <th>创建时间</th>
            <th>状态</th>
            <th>操作</th>
        </tr>
        <tbody id="tbody"></tbody>

    </table>
</center>
<div id="mask-kk">
</div> 
<div class="popup-kk">
    @* 弹出层内容 *@
    <center>
        <input type="hidden" style="width:300px;" id="Id" autocomplete="off" />
        <div class="layoutDiv">
            <span>用户名</span>
            <input type="text" style="width:300px;" id="Name" autocomplete="off" />
        </div>
        <div class="layoutDiv">
            <span>年&nbsp;&nbsp;&nbsp;龄</span>
            <input type="text" style="width:300px;" id="Age" autocomplete="off" />
        </div>
        <div class="layoutDiv">
            <span>学&nbsp;&nbsp;&nbsp;校</span>
            <input type="text" style="width:300px;" id="School" />
        </div>
        <div class="layoutDiv">
        </div>
        <button style="width:80px; margin-left:10px;" onclick="UserOptions.Update()">确认</button>
        <button style="width:80px; margin-left:10px;" onclick="UserOptions.Reset()">重置</button>
        <button style="width:80px; margin-left:10px;" onclick="closeWindow()">关闭</button>
    </center>
</div>
3.JS代码

$(function () {
    UserOptions.GetUsers();
})
var UserOptions = {
    //加载数据源
    GetUsers:function(){
        $.ajax({
            url: '/Home/GetUser',
            success: function (data) {
               $("#table").show();
                var html = "";
                for (var i = 0; i < data["table"].length; i++) {
                    html += "<tr><td>" + data["table"][i]["id"] + "</td><td>" + data["table"][i]["name"] + "</td><td>" + data["table"][i]["age"] + "</td><td>" + data["table"][i]["sex"] + "</td><td>" + data["table"][i]["hobby"] + "</td><td>" + data["table"][i]["school"] + "</td><td>" + data["table"][i]["height"] + "</td><td>" + data["table"][i]["createTime"] + "</td><td>" + data["table"][i]["status"] + "</td><td><input type='button' onclick='OpenModelWindow(this)' value='修改' data-id='" + data["table"][i]["id"] +"' / >|<input type='button'onclick='UserOptions.Del(this)' value='删除' data-id='" + data["table"][i]["id"]+"' / ></td></tr>"
                }
                $("#tbody").html(html)
            }
        })
    },
    //修改
    Update: function () {
    
        $.ajax({
            url: '/Home/UpdateUserById',
            data: {
                id: $("#Id").val(),
                name: $("#Name").val(),
                school: $("#School").val(),
                age: $("#Age").val(),
            },
            success: function (data) {
                alert(data);
                closeWindow();
                UserOptions.GetUsers();
                
            }

        })
    },
    //删除
    Del: function (obj) {
        var id = $(obj).attr("data-id");
        $.ajax({
            url: '/Home/DelUserById',
            data: {
                id:id,
            },
            success: function (data) {
                alert(data);
                //重新加载数据
                UserOptions.GetUsers();
            }

        })
    },
    Reset: function () {
        $("#Name").val("");
        $("#Age").val("");
        $("#School").val("");
    }
}

//打开
function OpenModelWindow(obj) {
    $('#mask-kk').css({
        display: 'block',
        height: $(document).height()
    })
    var $Popup = $('.popup-kk');
    $Popup.css({
        left: ($('body').width() - $Popup.width()) / 2 + 'px',
        top: ($(window).height() - $Popup.height()) / 2 + $(window).scrollTop() + 'px',
        display: 'block'
    })
    $("body").css({ overflow: "hidden" });
    var id = $(obj).attr("data-id");
    $.ajax({
        url: '/Home/GetUserById',
        data: {
            id: id,
        },
        success: function (data) {
            $("#Id").val(data["table"][0]["id"]);
            $("#Name").val(data["table"][0]["name"]);
            $("#Age").val(data["table"][0]["age"]);
            $("#School").val(data["table"][0]["school"]);
        }

    })
}
//关闭
function closeWindow() {
    $('#mask-kk,.popup-kk').css('display', 'none');
    $("body").css({ overflow: "" })
}

4.我自定义的文件

{
  //自定义配置文件
  "ConnectionString": {
    "ConStr": "Data Source=.;Initial Catalog=TestDb;Integrated Security=True"

  }

}

5.我的配置类

using Microsoft.Extensions.Configuration;
using System.IO;

namespace NetCore.ConfigurationFile
{
    /// <summary>
    /// 配置类
    /// </summary>
    public class ConnectionString
    {

        private static readonly object objLock = new object();
        private static ConnectionString instance = null;
        IConfigurationRoot config = default(IConfigurationRoot);

        public ConnectionString()
        {
            ConfigurationBuilder configuration = new ConfigurationBuilder();
            //读取配置文件
            config = configuration.SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile(file =>
            {
                file.Path = "/config.json";
                file.Optional = false;
                file.ReloadOnChange = true;

            }).Build();
        }

        public static ConnectionString GetInstance()
        {
            if (instance == null)
            {
                lock (objLock)
                {
                    if (instance == null)
                    {
                        instance = new ConnectionString();
                    }
                }
            }

            return instance;
        }

        public static string GetConfig(string section,string key)
        {
            return (string)GetInstance().config.GetSection(section).GetValue(typeof(string), key);
        }
    }

}

6.贴出我的SQLHelper帮助类


using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Collections;
using System.Data.SqlTypes;
using System.IO;
using NetCore.ConfigurationFile;

namespace HomeMediaFileManageSystemUtilts.Sql
{
    /// <summary>
    /// 数据库的通用访问代码 抽象类
    /// 不允许实例化,在应用时直接调用即可
    /// </summary>
    public abstract class SqlHelper
    {
        /// <summary>
        /// 数据库连接字符串
        /// </summary>
        public static string connectionString = ConnectionString.GetConfig("ConnectionString", "ConStr");
        //public static string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["DBConn"].ConnectionString;

        // Hashtable to store cached parameters
        private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable());
        private static string saveFilePath;

        /// <summary>
        /// 设置多个数据库连接的字符串
        /// </summary>
        /// <param name="conn"></param>
        public static void SetConStr(string section = "ConnectionString", string key = "ConStr")
        {
            connectionString = ConnectionString.GetConfig(section, key);
        }
        #region //ExecteNonQuery方法
        /// <summary>
        ///执行一个不需要返回值的SqlCommand命令,通过指定专用的连接字符串。
        /// 使用参数数组形式提供参数列表 
        /// </summary>
        /// <param name="connectionString">一个有效的数据库连接字符串</param>
        /// <param name="cmdType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param>
        /// <param name="cmdText">存储过程的名字或者 T-SQL 语句</param>
        /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>
        /// <returns>返回一个数值表示此SqlCommand命令执行后影响的行数</returns>
        public static int ExecteNonQuery(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
        {
            SqlCommand cmd = new SqlCommand();
            using (SqlConnection conn = new SqlConnection(connectionString))
            {
                //通过PrePareCommand方法将参数逐个加入到SqlCommand的参数集合中
                PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
                int val = cmd.ExecuteNonQuery();
                //清空SqlCommand中的参数列表
                cmd.Parameters.Clear();
                return val;
            }
        }

        /// <summary>
        ///执行一个不需要返回值的SqlCommand命令,通过指定专用的连接字符串。
        /// 使用参数数组形式提供参数列表 
        /// </summary>
        /// <param name="cmdType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param>
        /// <param name="cmdText">存储过程的名字或者 T-SQL 语句</param>
        /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>
        /// <returns>返回一个数值表示此SqlCommand命令执行后影响的行数</returns>
        public static int ExecteNonQuery(CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
        {
            return ExecteNonQuery(connectionString, cmdType, cmdText, commandParameters);
        }

        /// <summary>
        ///存储过程专用
        /// </summary>
        /// <param name="cmdText">存储过程的名字</param>
        /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>
        /// <returns>返回一个数值表示此SqlCommand命令执行后影响的行数</returns>
        public static int ExecteNonQueryProducts(string cmdText, params SqlParameter[] commandParameters)
        {
            return ExecteNonQuery(CommandType.StoredProcedure, cmdText, commandParameters);
        }

        /// <summary>
        ///Sql语句专用
        /// </summary>
        /// <param name="cmdText">T_Sql语句</param>
        /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>
        /// <returns>返回一个数值表示此SqlCommand命令执行后影响的行数</returns>
        public static int ExecteNonQueryText(string cmdText, params SqlParameter[] commandParameters)
        {
            return ExecteNonQuery(CommandType.Text, cmdText, commandParameters);
        }

        #endregion

        #region//GetTable方法

        /// <summary>
        /// 执行一条返回结果集的SqlCommand,通过一个已经存在的数据库连接
        /// 使用参数数组提供参数
        /// </summary>
        /// <param name="connecttionString">一个现有的数据库连接</param>
        /// <param name="cmdTye">SqlCommand命令类型</param>
        /// <param name="cmdText">存储过程的名字或者 T-SQL 语句</param>
        /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>
        /// <returns>返回一个表集合(DataTableCollection)表示查询得到的数据集</returns>
        public static DataTableCollection GetTable(string connecttionString, CommandType cmdTye, string cmdText, SqlParameter[] commandParameters)
        {
            SqlCommand cmd = new SqlCommand();
            DataSet ds = new DataSet();
            using (SqlConnection conn = new SqlConnection(connecttionString))
            {
                PrepareCommand(cmd, conn, null, cmdTye, cmdText, commandParameters);
                SqlDataAdapter adapter = new SqlDataAdapter();
                adapter.SelectCommand = cmd;
                adapter.Fill(ds);
            }
            DataTableCollection table = ds.Tables;
            return table;
        }

        /// <summary>
        /// 执行一条返回结果集的SqlCommand,通过一个已经存在的数据库连接
        /// 使用参数数组提供参数
        /// </summary>
        /// <param name="cmdTye">SqlCommand命令类型</param>
        /// <param name="cmdText">存储过程的名字或者 T-SQL 语句</param>
        /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>
        /// <returns>返回一个表集合(DataTableCollection)表示查询得到的数据集</returns>
        public static DataTableCollection GetTable(CommandType cmdTye, string cmdText, SqlParameter[] commandParameters)
        {
            return GetTable(SqlHelper.connectionString, cmdTye, cmdText, commandParameters);
        }

        /// <summary>
        /// 存储过程专用
        /// </summary>
        /// <param name="cmdText">存储过程的名字或者 T-SQL 语句</param>
        /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>
        /// <returns>返回一个表集合(DataTableCollection)表示查询得到的数据集</returns>
        public static DataTableCollection GetTableProducts(string cmdText, SqlParameter[] commandParameters)
        {
            return GetTable(CommandType.StoredProcedure, cmdText, commandParameters);
        }

        /// <summary>
        /// Sql语句专用
        /// </summary>
        /// <param name="cmdText"> T-SQL 语句</param>
        /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>
        /// <returns>返回一个表集合(DataTableCollection)表示查询得到的数据集</returns>
        public static DataTableCollection GetTableText(string cmdText, SqlParameter[] commandParameters)
        {
            return GetTable(CommandType.Text, cmdText, commandParameters);
        }

        #endregion

        /// <summary>
        /// 为执行命令准备参数
        /// </summary>
        /// <param name="cmd">SqlCommand 命令</param>
        /// <param name="conn">已经存在的数据库连接</param>
        /// <param name="trans">数据库事物处理</param>
        /// <param name="cmdType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param>
        /// <param name="cmdText">Command text,T-SQL语句 例如 Select * from Products</param>
        /// <param name="cmdParms">返回带参数的命令</param>
        private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, CommandType cmdType, string cmdText, SqlParameter[] cmdParms)
        {
            //判断数据库连接状态
            if (conn.State != ConnectionState.Open)
                conn.Open();
            cmd.Connection = conn;
            cmd.CommandText = cmdText;
            //判断是否需要事物处理
            if (trans != null)
                cmd.Transaction = trans;
            cmd.CommandType = cmdType;
            if (cmdParms != null)
            {
                foreach (SqlParameter parm in cmdParms)
                    cmd.Parameters.Add(parm);
            }
        }

        /// <summary>
        /// Execute a SqlCommand that returns a resultset against the database specified in the connection string 
        /// using the provided parameters.
        /// </summary>
        /// <param name="connectionString">一个有效的数据库连接字符串</param>
        /// <param name="cmdType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param>
        /// <param name="cmdText">存储过程的名字或者 T-SQL 语句</param>
        /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>
        /// <returns>A SqlDataReader containing the results</returns>
        public static SqlDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
        {
            SqlCommand cmd = new SqlCommand();

            // we use a try/catch here because if the method throws an exception we want to 
            // close the connection throw code, because no datareader will exist, hence the 
            // commandBehaviour.CloseConnection will not work
            try
            {
                SqlConnection conn = new SqlConnection(connectionString);

                PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
                SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                cmd.Parameters.Clear();
                return rdr;

            }
            catch
            {
                throw;
            }
        }

        #region//ExecuteDataSet方法

        /// <summary>
        /// return a dataset
        /// </summary>
        /// <param name="connectionString">一个有效的数据库连接字符串</param>
        /// <param name="cmdType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param>
        /// <param name="cmdText">存储过程的名字或者 T-SQL 语句</param>
        /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>
        /// <returns>return a dataset</returns>
        public static DataSet ExecuteDataSet(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
        {
            SqlCommand cmd = new SqlCommand();
            try
            {
                using (SqlConnection conn = new SqlConnection(connectionString))
                {
                    PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
                    SqlDataAdapter da = new SqlDataAdapter();
                    DataSet ds = new DataSet();
                    da.SelectCommand = cmd;
                    da.Fill(ds);
                    return ds;
                }
            }
            catch
            {
                throw;
            }
        }

        /// <summary>
        /// 返回一个DataSet
        /// </summary>
        /// <param name="cmdType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param>
        /// <param name="cmdText">存储过程的名字或者 T-SQL 语句</param>
        /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>
        /// <returns>return a dataset</returns>
        public static DataSet ExecuteDataSet(CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
        {
            return ExecuteDataSet(connectionString, cmdType, cmdText, commandParameters);
        }

        /// <summary>
        /// 返回一个DataSet
        /// </summary>
        /// <param name="cmdText">存储过程的名字</param>
        /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>
        /// <returns>return a dataset</returns>
        public static DataSet ExecuteDataSetProducts(string cmdText, params SqlParameter[] commandParameters)
        {
            return ExecuteDataSet(connectionString, CommandType.StoredProcedure, cmdText, commandParameters);
        }

        /// <summary>
        /// 返回一个DataSet
        /// </summary>
        /// <param name="cmdText">T-SQL 语句</param>
        /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>
        /// <returns>return a dataset</returns>
        public static DataSet ExecuteDataSetText(string cmdText, params SqlParameter[] commandParameters)
        {
            return ExecuteDataSet(connectionString, CommandType.Text, cmdText, commandParameters);
        }

        public static DataView ExecuteDataSet(string connectionString, string sortExpression, string direction, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
        {
            SqlCommand cmd = new SqlCommand();
            try
            {
                using (SqlConnection conn = new SqlConnection(connectionString))
                {
                    PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
                    SqlDataAdapter da = new SqlDataAdapter();
                    DataSet ds = new DataSet();
                    da.SelectCommand = cmd;
                    da.Fill(ds);
                    DataView dv = ds.Tables[0].DefaultView;
                    dv.Sort = sortExpression + " " + direction;
                    return dv;
                }
            }
            catch
            {

                throw;
            }
        }
        #endregion

        #region // ExecuteScalar方法

        /// <summary>
        /// 返回第一行的第一列
        /// </summary>
        /// <param name="cmdType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param>
        /// <param name="cmdText">存储过程的名字或者 T-SQL 语句</param>
        /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>
        /// <returns>返回一个对象</returns>
        public static object ExecuteScalar(CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
        {
            return ExecuteScalar(SqlHelper.connectionString, cmdType, cmdText, commandParameters);
        }

        /// <summary>
        /// 返回第一行的第一列存储过程专用
        /// </summary>
        /// <param name="cmdText">存储过程的名字</param>
        /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>
        /// <returns>返回一个对象</returns>
        public static object ExecuteScalarProducts(string cmdText, params SqlParameter[] commandParameters)
        {
            return ExecuteScalar(SqlHelper.connectionString, CommandType.StoredProcedure, cmdText, commandParameters);
        }

        /// <summary>
        /// 返回第一行的第一列Sql语句专用
        /// </summary>
        /// <param name="cmdText">者 T-SQL 语句</param>
        /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>
        /// <returns>返回一个对象</returns>
        public static object ExecuteScalarText(string cmdText, params SqlParameter[] commandParameters)
        {
            return ExecuteScalar(SqlHelper.connectionString, CommandType.Text, cmdText, commandParameters);
        }

        /// <summary>
        /// Execute a SqlCommand that returns the first column of the first record against the database specified in the connection string 
        /// using the provided parameters.
        /// </summary>
        /// <remarks>
        /// e.g.:  
        ///  Object obj = ExecuteScalar(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));
        /// </remarks>
        /// <param name="connectionString">一个有效的数据库连接字符串</param>
        /// <param name="cmdType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param>
        /// <param name="cmdText">存储过程的名字或者 T-SQL 语句</param>
        /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>
        /// <returns>An object that should be converted to the expected type using Convert.To{Type}</returns>
        public static object ExecuteScalar(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
        {
            SqlCommand cmd = new SqlCommand();

            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);
                object val = cmd.ExecuteScalar();
                cmd.Parameters.Clear();
                return val;
            }
        }

        /// <summary>
        /// Execute a SqlCommand that returns the first column of the first record against an existing database connection 
        /// using the provided parameters.
        /// </summary>
        /// <remarks>
        /// e.g.:  
        ///  Object obj = ExecuteScalar(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));
        /// </remarks>
        /// <param name="connectionString">一个有效的数据库连接字符串</param>
        /// <param name="cmdType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param>
        /// <param name="cmdText">存储过程的名字或者 T-SQL 语句</param>
        /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>
        /// <returns>An object that should be converted to the expected type using Convert.To{Type}</returns>
        public static object ExecuteScalar(SqlConnection connection, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
        {
            SqlCommand cmd = new SqlCommand();
            PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);
            object val = cmd.ExecuteScalar();
            cmd.Parameters.Clear();
            return val;
        }

        #endregion

        /// <summary>
        /// add parameter array to the cache
        /// </summary>
        /// <param name="cacheKey">Key to the parameter cache</param>
        /// <param name="cmdParms">an array of SqlParamters to be cached</param>
        public static void CacheParameters(string cacheKey, params SqlParameter[] commandParameters)
        {
            parmCache[cacheKey] = commandParameters;
        }

        /// <summary>
        /// Retrieve cached parameters
        /// </summary>
        /// <param name="cacheKey">key used to lookup parameters</param>
        /// <returns>Cached SqlParamters array</returns>
        public static SqlParameter[] GetCachedParameters(string cacheKey)
        {
            SqlParameter[] cachedParms = (SqlParameter[])parmCache[cacheKey];
            if (cachedParms == null)
                return null;
            SqlParameter[] clonedParms = new SqlParameter[cachedParms.Length];
            for (int i = 0, j = cachedParms.Length; i < j; i++)
                clonedParms[i] = (SqlParameter)((ICloneable)cachedParms[i]).Clone();
            return clonedParms;
        }

        /// <summary>
        /// 检查是否存在
        /// </summary>
        /// <param name="strSql">Sql语句</param>
        /// <param name="cmdParms">参数</param>
        /// <returns>bool结果</returns>
        public static bool Exists(string strSql, params SqlParameter[] cmdParms)
        {
            int cmdresult = Convert.ToInt32(ExecuteScalar(connectionString, CommandType.Text, strSql, cmdParms));
            if (cmdresult == 0)
            {
                return false;
            }
            else
            {
                return true;
            }
        }

        }
    }



C# 数据库访问与ORM框架全面指南:从ADO.NET到Entity Framework Core 在现代应用开发中,数据持久化是核心需求之一。作为.NET生态系统中的主力语言,C#提供了丰富多样的数据库访问技术和工具。本文将全面探讨C#中的数据库访问方式,重点介绍三种主流ORM(对象关系映射)框架:Entity Framework Core、Dapper和NHibernate,帮助开发者根据项目需求做出合理的技术选型。 阅读详情

相关推荐

掌握 C# 数据库操作:ADO.NET、EF Core 与 Dapper 的最佳实践

在 C# 中,ADO.NET、Entity Framework Core 和 Dapper 各有优缺点。根据你的项目需求,选择合适的数据库操作方式可以有效提高开发效率与性能。掌握这些技术,并在实际项目中灵活运用,能够帮助你高效地进行数据库开发和优化。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1366

关于前台页面的校验

这是前台页面代码 <%@ Page Title="" Language="C#" MasterPageFile="~/Master/MainMaster.Master" AutoEventWireup="true" CodeBehind="Register.aspx.cs" Inherits="BookShop.Web.Register" %> <asp:Content ID="Content1" ContentPlaceHolderID="Header" runat="server"&

tokikou的博客 370

ASP.NET Core 入门 - 使用 ADO.NET

在上述代码中,我们创建了一个名为 “DataAccess” 的类,该类包含了两个方法:InsertData 和 GetData。我们创建了一个数据访问类,使用 SqlConnection、SqlCommand 和 SqlDataAdapter 类来执行数据库操作,并在控制器中使用该数据访问类进行数据插入和获取。在 ASP.NET Core 中,我们可以使用 ADO.NET 来访问和操作关系型数据库。通过以上步骤,我们成功地在 ASP.NET Core 项目中使用 ADO.NET 进行了数据库操作。

CodeBandit的博客 388

深入GPU硬件架构及运行机制

目录 一、导言 1.1 为何要了解GPU? 1.2 内容要点 1.3 带着问题阅读 二、GPU概述 2.1 GPU是什么? 2.2 GPU历史 2.2.1 NV GPU发展史 2.2.2 N...

weixin_30871905的博客 3776

C#课程表管理系统开发实战指南

C#(读作 “C Sharp”)是由微软开发的一种现代化、类型安全的面向对象的编程语言,它是.NET平台的主力语言之一。C#语法简洁、表达能力强,能够快速开发各种应用程序。基础语法包括变量、数据类型、运算符、条件语句、循环结构、数组和字符串处理等。掌握这些基础对于后续学习C#的高级特性以及面向对象编程至关重要。

weixin_42181686的博客 547

CTP-API开发系列之三:柜台系统简介

综合交易平台(Comprehensive Transaction Platform,CTP)是专门为期货公司开发的一套期货经纪业务管理系统,由交易、风险控制和结算三大系统组成。接下来分享的内容,对于期货公司的负责交易、运维同事会比较熟悉,针对CTP-API接口对接的朋友可以了解一下,在接口之上的系统是怎样的。

码上助君的专栏 6205

.Net Core 系列:2、ADO.Net 基础

  目录: 1、环境搭建 2、ADO.Net 基础 3、ASP.Net Core 基础 4、Entity Framework Core基础 5、实现登录注册功能 6、实现目录管理功能 7、实现文章发布、编辑、阅览和删除功能 8、实现文章回复功能 9、实现文章点赞功能 ...

weixin_30737433的博客 451

半导体测试(一)

探针台是一种用于在晶圆上进行配合探针卡进行电路量测的设备,在测试过程中,探针工作站会将探针与晶圆上的每个die进行接触,以进行电性测量。在这个过程中,每个die都被测试以确保它能基本满足器件的特征或设计规格书(Specification),通常包括电压、电流、时序和功能的验证。晶圆是一个圆形的硅片,在这个半导体的基础之上,建立了许多独立的单个的电路;在所有的die都被探测(Probed)之后,晶圆被切割成独立的dice,这就是常说的die saw,所有被标示为失效的die都被报废,。

m0_37606066的博客 8435

.Net Core使用ADO.NET实现增删改查

net core 是微软公司推出的一个跨平台 框架 他重写了Clr底层 屏蔽window 的依赖,可以运行window ,linux ,max等系统 效率比.net framework 要高出很多。简单说明下.net core 的目录。6.贴出我的SQLHelper帮助类。下面是我学习的时候 写的增删改查。

ZyrJavascrip的博客 490

Apifox CLI + Claude Skills:将接口自动化测试融入ai

基于 Apifox CLI、Claude Code以及Claude Skills组合,实现自然语言触发接口自动化测试。

wwz_0012的博客 599

金蝶云星空-协同开发云-安装开发环境

金蝶协同开发云就是不需要每一个开发都在自己的本机安装开发环境,自己安装可容易出错,包括源代码管理也一并解决了,大大减少了开发人员的工作量和降低了上手的难度。

qq_33881408的博客 5602

.NET Core 使用ADO.NET连接操作MySQL数据库

NET Core 中使用 ADO.NET 连接并操作 MySQL 数据库可以按照以下步骤进行。你需要安装 MySQL 数据库驱动程序(MySql.Data)并编写代码来执行数据库操作。下面是一个示例代码,展示如何使用 ADO.NET 连接到 MySQL 数据库,并执行基本的 CRUD 操作(创建、读取、更新、删除)。1、安装 MySQL 数据库驱动程序。2、编写代码连接 MySQL 数据库。

weixin_42098295的博客 2036

Unity布娃娃系统 Ragdoll Mecanim Mixer使用

6. 选完之后,左键下面的hip等角色各个部位不松开鼠标,拖拽连接到上面Amature的各个部位,如图,下面所有部位都连接完之后,第二步点击Configure Selected Bones确认你的部位连接选择。要做一个布娃娃和动画混合的项目,这个插件是比较不错的,搜了一圈文章教程也是抄来抄去,抄的没有头没有尾,自己摸索着用了一下,记录使用过程吧。8. 之后就点击步骤7图一中的Create Ragdoll,会发现player结构发生变化,如图。4. 添加完脚本之后会显示你的player结构,如图。

SuShengQuanshiW的博客 1650

从CRUD到高级功能:EF Core在.NET Core中全面应用(一)

Guid值不连续,使用Guid类型做主键的时候不能把主键设置为聚集索引,因为聚集索引是按照顺序保存主键的,因此用Guid做主键性能差,比如MySQL的InnoDB引擎中主键是强制使用聚集索引的,有的数据库支持部分的连续Guid,比如SQLServer中的NewSequentialIdO,但也不能解决问题。对于EFCore中的配置类,上文EFCore初识使用中已经讲解到了,其实.net core已经默认给我们进行了约定配置,根据我们设置的属性进行自动判断,其。

ztK63LrD的博客 2578

知识存储之Apache Jena

知识图谱的存储可以分为基于表结构的存储和基于图结构的存储。1️⃣基于表结构的存储基于表结构的存储利用二维的数据表对知识图谱中的数据进行存储。根据不同的设计原则,知识图谱可以具有不同的表结构:💨知识图谱实质上是一个个的三元组,一种简单直接的存储方式是设计一张三元组表用于存储所有三元组,有不少比较成熟的产品利用该形式存储知识图谱,包括Jena、Oracle、Virtuoso等。💨为每种类型构建一张表,同一类型的实例存放在相同的表中。

Puzzle的博客 6065

二、TCP/IP协议之网络层(IP地址的格式、分类、报文格式)

数据报每经过一个路由器,路由器都要重新计算一下首部检验和,若首部未发生变化,则此结果必为 0,于是就保留这个数据报。对于网络号相的设备,无论实际所处的物理位置如何,它们都是处在同一个网络中。在首部的固定部分的后面是一些可选字段,其长度是可变的。IPv4 软件在存储器中维持一个计数器,每产生一个数据报,计数器就加 1,并将此值赋给标识字段。表示数据报在网络中的寿命,英文缩写是 TTL(Time To Live),功能是“跳数限制”。地址的网络号码字段用来标识一个网络,网络号码字段的前几位用来区分。

锦慈的技术博客 185

.Net Core使用ADO.NET实现数据库操作

.NET CORE 项目开发使用ADO.NET操作数据库方法如下: 第一步:项目安装System.Data.SqlClient依赖项 第二步:appsettings.json文件中添加数据库连接代码 "ConStr": "Data Source=数据库地址;database=数据库名称;uid=用户名;pwd=密码;MAX Pool Size=512" 完整代码如下: { "Logging": { "LogLevel": { "Default": "Information",

f245775274的博客 4311

软考高级系统架构设计师历年论文真题深度分析(2011-2025)

本文系统分析了2011-2025年系统架构设计师论文真题,归纳出十大主题类别,包括架构风格、企业集成、数据技术、非功能属性等。研究发现新兴技术占比最高(18.8%),企业集成、数据架构和非功能属性为三大核心考点。论文命题呈现明显技术演进特征,从经典架构理论逐步转向云原生、AI融合等前沿方向。备考建议重点关注高频考点和技术前沿,同时强化场景化解决方案能力。分析表明,架构师考试持续跟踪行业技术发展,注重理论与实践结合,为考生提供了明确的备考方向。

一几文的编程学习笔记。 2056

.NET Core使用EF Core框架

Entity Framework (EF) Core 是轻量化、可扩展、开源和跨平台版的常用 Entity Framework 数据访问技术。 EF Core 可用作对象关系映射程序 (O/RM),以便于 .NET 开发人员能够使用 .NET 对象来处理数据库,这样就不必经常编写大部分数据访问代码了。core不像framwork一样可以在项目信件中直接选择ado.net实体数据模型。如下 说简单点,就是在我们做增删改查的时候,不用再写非常繁琐的SQL语句, 在以前,我们写完SQL语句后,查询出来的数据还要

你要明白,任何问题都不是孤立存在的,一定有人曾经遇到过,并且已经有更好的解决办法了,只是我还不知道。我不应该在黑暗中独自前行,去重新发明轮子,也许我的顿悟,只是别人的基本功!我应该要站在巨人的肩膀上,学习更成熟的经验和方法,然后再来解决这个问题 6405

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

.net core 连接 mysql_.NET Core 使用ADO.NET连接操作MySQL数据库

1、通过Nuget引用MySqlConnectorMySqlConnector是用于.NET和.NETCore的异步MySQL连接器,MySQL的ADO.NET数据提供程序。它提供的实现,查询和更新从托管代码数据库所需类(DbConnection,DbCommand,DbDataReader,DbTransaction等)。此库为数据库操作实现真正的异步I/O,而不阻塞(或使用Task.Run在...

weixin_39613291的博客 1424

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

ADO.NET,ADO .NET Core,ADO .NET API ,EF,ORM,Vue脚手架,XML

一. ADO.NET ADO.NET是一组可以与数据源进行交互的面向对象类库 二,ORM ORM是Object(对象) ,Relative(关系),Mapping(映射) ORM是为了解决面向对象与数据库之间互不匹配的一种现象 二,EF EF的全称是Entity Framework(数据持久化) WebForm项目对数据库的操控就是通过ADO.NET MVC项目对数据库的操控用的则是ORM,但ORM也是以ADO.NET为基础发展出来的。 EF有三种连接数据库的模式,分别是CodeFirst,DBF

略懂一点的少年的博客 855

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Entity Framework Core (EF Core) 使用ado.net

本文介绍了在Entity Framework Core中如何结合使用ADO.NET实现特定场景需求。主要内容包括:1)通过DbContext获取底层数据库连接执行原生SQL命令;2)使用FromSqlRaw/ExecuteSqlRaw方法执行原始SQL查询和存储过程;3)利用RelationalCommandBuilder构建复杂命令;4)针对批量操作和N+1查询问题的性能优化方案。文章特别强调了事务集成、参数化查询等注意事项,建议在EFCore高级API无法满足需求时才使用ADO.NET底层操作,以平衡开

wangyun381974024的博客 672

vue.js crud_如何使用VS Code和ADO.NET使用ASP.NET Core执行CRUD操作

vue.js crud 介绍 (Introduction) In this article we are going to create a web application using ASP.NET Core MVC with the help of Visual Studio Code and ADO.NET. We will be creating a sample Employee Rec...

414

Asp.Net Core 使用Ado创建三层架构(添加与查询)实例

Asp.Net Core 使用Ado创建三层架构(添加与查询)实例 【下载地址】Asp.NetCore使用Ado创建三层架构添加与查询实例 这是一个专注于Asp.Net Core环境下使用Ado.NET实现三层架构的实例教程,特别针对添加和查询操作。通过该实例,开发者可以深入理解Asp.Net Core框架,并掌握如何在...

gitblog_06764的博客 294

Net Core下多种ORM框架特性及性能对比

在.NET Framework下有许多ORM框架,最著名的无外乎是Entity Framework,它拥有悠久的历史以及便捷的语法,在占有率上一路领先。但随着Dapper的出现,它的地位受到了威胁,本文对比了在.NET Core下 两种框架的表现以及与原生的ADO.NET 的对比。 1.1. Dapper是什么 Dapper是.NET的简单对象映射器,在速度方面拥有微型ORM之王的称号,几乎和

dotNET跨平台 1万+
上一篇: SQL知识点总结
下一篇: JavaScript HashTable
_徐林
博客等级 码龄9年 6粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值