连接数据库

方式一

SqlConnection connection = new SqlConnection();
connection.ConnectionString = "server=192.168.10.116;uid=sa;pwd=qwe20211114.;database=database_2";
connection.Open();
Console.WriteLine($"state={connection.State}");
Console.WriteLine($"DataBase={connection.Database}");
Console.WriteLine($"ServervERSION={connection.ServerVersion}");
Console.WriteLine($"DataSource={connection.DataSource}");
Console.WriteLine($"ConnectionTimeOut={connection.ConnectionTimeout}");
connection.Close();/**
* state=Open
DataBase=database_2
ServervERSION=14.00.3456
DataSource=192.168.10.116
ConnectionTimeOut=15*/

方式二

SqlConnection sqlConnection ;using ( sqlConnection = new SqlConnection("server=192.168.10.116;uid=sa;pwd=qwe20211114.;database=database_2")){sqlConnection.Open();Console.WriteLine($"state={sqlConnection.State}");Console.WriteLine($"DateBase={sqlConnection.Database}");Console.WriteLine($"ServerVersion={sqlConnection.ServerVersion}");Console.WriteLine($"DataSource={sqlConnection.DataSource}");Console.WriteLine($"ConnectionTimeOut={sqlConnection.ConnectionTimeout}");}  // 这里using 释放资源/*** state=Open
DateBase=database_2
ServerVersion=14.00.3456
DataSource=192.168.10.116
ConnectionTimeOut=15*/
Console.WriteLine($"datastate={sqlConnection.State}");/*** datastate=Closed*/

方式三

using SqlConnection sqlConnection = new SqlConnection("server=192.168.10.116;uid=sa;pwd=qwe20211114.;database=database_2");
sqlConnection.Open();
Console.WriteLine($"state={sqlConnection.State}");
Console.WriteLine($"DataBase={sqlConnection.Database}");
Console.WriteLine($"Serversion={sqlConnection.ServerVersion}");
Console.WriteLine($"DataSource={sqlConnection.DataSource}");
Console.WriteLine($"connectionTimeOUt={sqlConnection.ConnectionTimeout}");

using

/* *
* using : 引用命名空间
* using: 释放资源
*
* 1. 为什么以前我们定义的变量不需要释放资源呢?
* GC: 垃圾回收器,这里面封装了一些算法规定了什么时候去回收资源。我们自己定义一些变量,不
需要关心它有没有释放掉,因为GC会帮我们自动回收资源
*
* 2. 既然已经有了GC,为什么还需要手动的释放资源呢?
* 答:GC 只能回收托管资源(由.Net CLR管理的资源),而SqlConnection是属于非托管资源
*
* 3. 我怎么知道它是非托管?
* 答:如果它实现了IDisposable 接口,那么我们就可以使用using 来手动的释放资源了
*/

初始操作数据库Command

// 创建数据连接对象 并打开连接
using SqlConnection sqlConnection = new SqlConnection("server=192.168.10.116;uid=sa;pwd=qwe20211114.;database=database_2");
sqlConnection.Open();
// 创建命令执行对象
var sqlCommand = new SqlCommand();
// 绑定数据库连接
sqlCommand.Connection = sqlConnection;
// 书写sql 语句
string sqlString1 = "insert into product values ('gouqi',88)";
// 设置sql命令
sqlCommand.CommandText = sqlString1;
// 执行sql语句
sqlCommand.ExecuteNonQuery(); //增删改 执行的语句

获取首行首列

using SqlConnection sqlConnection = new SqlConnection("server=192.168.10.116;uid=sa;pwd=qwe20211114.;database=database_2");
sqlConnection.Open();
using SqlCommand sqlCommand = new SqlCommand("select count(*) from product");
sqlCommand.Connection = sqlConnection;
var executeScalar = sqlCommand.ExecuteScalar();
Console.WriteLine(executeScalar); // 获取首行首列

返回一个读取对象

using SqlConnection sqlConnection = new SqlConnection("server=192.168.10.116;uid=sa;pwd=qwe20211114.;database=database_2");
sqlConnection.Open();
SqlCommand sqlCommand = new SqlCommand("select * from product",sqlConnection);
SqlDataReader sqlDataReader = sqlCommand.ExecuteReader(); //返回一个读取对象
string s = sqlDataReader.ToString();
Console.WriteLine(s);

读取并展示数据

方式一

using SqlConnection sqlConnection = new SqlConnection("server=192.168.10.116;uid=sa;pwd=qwe20211114.;database=database_2");
sqlConnection.Open();
using SqlCommand sqlCommand = new SqlCommand("select * from product",sqlConnection);
using SqlDataReader sqlDataReader = sqlCommand.ExecuteReader();
while (sqlDataReader.Read())
{// 下标索引顺序必须和数据库顺序一直、、object id =sqlDataReader[0];object pname = sqlDataReader[1];object price = sqlDataReader[2];Console.WriteLine(id+"    "+ pname+"  "+price+"");
}

方式二

using SqlConnection sqlConnection = new SqlConnection("server=192.168.10.116;uid=sa;pwd=qwe20211114.;database=database_2");
sqlConnection.Open();
using SqlCommand sqlCommand = new SqlCommand("select * from product", sqlConnection);
using SqlDataReader sqlDataReader = sqlCommand.ExecuteReader();
while (sqlDataReader.Read())
{object id = sqlDataReader.GetValue(sqlDataReader.GetOrdinal("Id")); object pname = sqlDataReader.GetValue(sqlDataReader.GetOrdinal("ProductName"));object price = sqlDataReader.GetValue(sqlDataReader.GetOrdinal("Price"));Console.WriteLine("    "+id+"    "+pname+"    "+price);}

方式三

using SqlConnection connection = new SqlConnection("server=192.168.10.116;uid=sa;pwd=qwe20211114.;database=database_2");
connection.Open();
using SqlCommand command = new SqlCommand("select * from product", connection);
using SqlDataReader dataReader = command.ExecuteReader();while (dataReader.Read())
{Product product = new Product(dataReader.GetInt32(0),dataReader.GetString(1),dataReader.GetDecimal(2));Console.WriteLine(product.ToString());
}record Product(int Id,string ProductName,decimal Price);

SqlDataAdapter 适配器

DataSet 相当于是一个容器

// 创建数据连接
using SqlConnection connection = new SqlConnection("server=192.168.10.116;uid=sa;pwd=qwe20211114.;database=database_2");
// 创建数据库命令执行器 并绑定数据库连接
using SqlCommand sqlCommand = new SqlCommand("select * from product",connection);
// 创建适配器
using SqlDataAdapter sqlDataAdapter = new SqlDataAdapter();
// sql适配器 匹配 数据库命令执行器
sqlDataAdapter.SelectCommand = sqlCommand;
// 创建装数据的容器
DataSet dataSet = new DataSet();
// 执行sql 并把数据装入DataSet中
sqlDataAdapter.Fill(dataSet);
// 有多少行数据
Console.WriteLine(dataSet.Tables[0].Rows.Count);//2

数据由对象去接

SqlDataAdapter sqlDataAdapter = new SqlDataAdapter("select * from product", "server=192.168.10.116;uid=sa;pwd=qwe20211114.;database=database_2");// DataSet 是由于 DataTable 组成的 DataTable是由行组成的,行是由列组成的DataTable dataTables = new DataTable();sqlDataAdapter.Fill(dataTables);List<Product> products = new List<Product>();
foreach (DataRow row in dataTables.Rows)
{var product1 = new Product();product1.Id = Convert.ToInt32(row["id"]);if (row["price"] is not DBNull){product1.Price = Convert.ToDecimal(row["price"]);}if (row["ProductName"] is not DBNull){product1.ProductName = row["ProductName"].ToString();}products.Add(product1);
}
Console.WriteLine(products.Count);public class Product
{public int Id { get; set; }public string? ProductName { get; set; }public decimal Price { get; set; }public override string ToString(){return Id+"  "+ProductName+" "+Price;}
}

手动创建DataTable

DataTable dataTable = new DataTable("商品表");
// 创建列名
dataTable.Columns.Add("id");
dataTable.Columns.Add("productname");
DataColumn dataColumn = new DataColumn("price");
dataTable.Columns.Add(dataColumn);
// 创建行
DataRow dataRow = dataTable.NewRow();
dataRow["Id"] = 1;
dataRow["ProductName"] = "口红";
dataRow["Price"] = 269;
// 添加到DataTable中
dataTable.Rows.Add(dataRow);
List<Product> products = new List<Product>();
foreach (DataRow row in dataTable.Rows)
{var product1 = new Product();product1.Id = Convert.ToInt32(row["id"]);if (row["price"] is not DBNull){product1.Price = Convert.ToDecimal(row["price"]);}if (row["ProductName"] is not DBNull){product1.ProductName = row["ProductName"].ToString();}products.Add(product1);
}
Console.WriteLine(products[0].ToString());public class Product
{public int Id { get; set; }public string? ProductName { get; set; }public decimal Price { get; set; }public override string ToString(){return Id+"  "+ProductName+" "+Price;}
}

Rider 创建 配置文件

vs 创建配置文件


vs 添加配置文件的相关包

vs 操作 ConfigurationManager

App.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration><connectionStrings><add name="localString" connectionString="server=192.168.10.116;uid=sa;pwd=qwe20211114.;database=database_2"/></connectionStrings>
</configuration>

main

// 读取配置文件
string conString = ConfigurationManager.ConnectionStrings["localString"].ConnectionString;
using    SqlDataAdapter adapter = new SqlDataAdapter("select * from product", conString);
DataTable dataTable = new DataTable();
adapter.Fill(dataTable);
Console.WriteLine("===========");
Console.WriteLine(dataTable.Rows.Count);
Console.WriteLine("===========");

配置文件中读取其他的信息

app.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration><appSettings><add key="siteName" value="人生的意义是什么"/></appSettings>
</configuration>

main

// 读取配置文件
String str = ConfigurationManager.AppSettings["siteName"].ToString();
Console.WriteLine(str);

连接池

app.config -----> pooling = true

<?xml version="1.0" encoding="utf-8" ?>
<configuration><connectionStrings><add name="connString" connectionString="server=192.168.10.116;uid=sa;pwd=qwe20211114.;database=database_2;pooling=true"/></connectionStrings></configuration>

设置参数对象 SqlParameter

方式一 SqlParameter() – 查询个数

// 读取配置
string connectionString = ConfigurationManager.ConnectionStrings["connString"].ConnectionString;
// 建立数据库的连接
using   SqlConnection sqlConnection = new SqlConnection(connectionString);
// 打开连接
sqlConnection.Open();
// 创建 sql 执行对象
SqlCommand sqlCommand = new SqlCommand("select count(*) from Users where Account=@account and Pwd = @pwd",sqlConnection);
// 设置参数对象
SqlParameter sqlParameter = new SqlParameter();
sqlParameter.ParameterName = "account"; // 与sql语句上的参数名 对应上 可以不写@
sqlParameter.Size = 20; // 参数大小
sqlParameter.SqlDbType = SqlDbType.VarChar;//类型
sqlParameter.Value = "zhangsan"; //传入的值SqlParameter parameter = new SqlParameter();
parameter.ParameterName = "pwd"; // 参数名 与sql语句上的参数名 对应上 可以不写@
parameter.Size = 20; //参数大小
parameter.SqlDbType = SqlDbType.VarChar; // 类型
parameter.Value = "123"; // 参数值// add parameter
sqlCommand.Parameters.Add(sqlParameter);
sqlCommand.Parameters.Add(parameter);// execute sql and return result
int count = Convert.ToInt32(sqlCommand.ExecuteScalar());
if (count > 0)
{Console.WriteLine("登录成功");
}
else
{Console.WriteLine("密码错误");
}

方式二 参数数组 SqlParameter[] --> insert

// get configuration information
string connectionString = ConfigurationManager.ConnectionStrings["connString"].ConnectionString;
// get sql connnection
using SqlConnection scon = new SqlConnection(connectionString);
// open sql connnection
scon.Open();
// create sqlComand
SqlCommand sqlCommand = new SqlCommand("insert into Users(NickName,Account,Pwd) values (@nickName,@account,@pwd);",scon);
// create sqlParamter[]
SqlParameter[] parameters =
{new SqlParameter("nickName","lzy"),
new SqlParameter("account","lzy"),
new SqlParameter("pwd","lzy")
};
// add more paramters
sqlCommand.Parameters.AddRange(parameters);
sqlCommand.ExecuteNonQuery();

Parameter = new SqlParameter("@pname", (object)0);

如果不执行此转换,编译器假定你正在尝试调用 SqlParameter(String, SqlDbType) 构造函数重载。

方式三 修改 update

String connectionString = ConfigurationManager.ConnectionStrings["connString"].ConnectionString;
using SqlConnection connection = new SqlConnection(connectionString);
connection.Open();
using SqlCommand sqlCommand = new SqlCommand("update Users set Account=@account,NickName=@nickName,Pwd = @pwd where Id =@id",connection);SqlParameter[] parameters =
{new SqlParameter("nickName",SqlDbType.VarChar,20),new SqlParameter("account",SqlDbType.VarChar,20),new SqlParameter("pwd",SqlDbType.VarChar,20),new SqlParameter("id",SqlDbType.Int,4)
};parameters[0].Value = "update";
parameters[1].Value = "update";
parameters[2].Value = "update";
parameters[3].Value = 1;sqlCommand.Parameters.AddRange(parameters);
sqlCommand.ExecuteNonQuery();

方式四 模糊查询 like

String connectionstring = ConfigurationManager.ConnectionStrings["connString"].ConnectionString;
SqlParameter[] parameters =
{new SqlParameter("nickName",SqlDbType.VarChar),new SqlParameter("pwd",SqlDbType.VarChar)
};
string name = "pdat";
parameters[0].Value = $"%{name}%";
parameters[1].Value = "update";SqlDataAdapter sqlDataAdapter = new SqlDataAdapter("select * from Users where NickName like @nickName and Pwd=@pwd",connectionstring);
//sqlDataAdapter.InsertCommand
//sqlDataAdapter.DeleteCommand
//sqlDataAdapter.UpdateCommandsqlDataAdapter.SelectCommand.Parameters.AddRange(parameters);
DataTable dataTable = new DataTable();
sqlDataAdapter.Fill(dataTable);foreach (DataRow dataTableRow in dataTable.Rows)
{Users users = new Users();users.Id = Convert.ToInt32(dataTableRow["ID"]);users.NickName = dataTableRow["NickName"].ToString();users.Account = dataTableRow["Account"].ToString();users.Pwd = dataTableRow["Pwd"].ToString();users.ToStrings();
}public class Users
{public int Id { get; set; }public string NickName { get; set; }public string Account { get; set; }public string Pwd { get; set; }public void ToStrings() {Console.WriteLine("  "+ Id + "  "+ NickName + "    "+ Account + "   "+ Pwd);}
}

方式五 单个删除 delete

string connectionString = ConfigurationManager.ConnectionStrings["connString"].ConnectionString;
using SqlConnection sqlConnection = new SqlConnection(connectionString);
sqlConnection.Open();
using SqlCommand command =  new SqlCommand("delete from Users where Id = @id;", sqlConnection);
command.Parameters.Add(new SqlParameter("id", 1));
command.ExecuteNonQuery();

方式六 批量删除 more Delete

string connectionString = ConfigurationManager.ConnectionStrings["localString"].ConnectionString;
SqlConnection sqlConnection = new SqlConnection(connectionString);
sqlConnection.Open();
SqlCommand sqlCommand = new SqlCommand("delete from Users where Id=@id",sqlConnection);
// 模拟删除的id
int[] idList = new int[] { 2,3,4};
foreach (int id in idList)
{sqlCommand.Parameters.Add(new SqlParameter("id", id));sqlCommand.ExecuteNonQuery();sqlCommand.Parameters.Clear(); // 必须清除之前的参数}

方式七 事务

String connectionString = ConfigurationManager.ConnectionStrings["connString"].ConnectionString;
SqlConnection sqlConnection = new SqlConnection(connectionString);
sqlConnection.Open();
using SqlTransaction beginTransaction = sqlConnection.BeginTransaction(); //开启事务
// 命令对象指定事务对象
using SqlCommand sqlCommand = new SqlCommand("delete from Users where Id = @id",sqlConnection,beginTransaction);
try
{int[] idList = { 5, 6};foreach (int id in idList){sqlCommand.Parameters.Add(new SqlParameter("id",id));sqlCommand.ExecuteNonQuery();sqlCommand.Parameters.Clear();int a = 12;int b = 0;int zonre = a/b;}
}
catch(Exception e)
{Console.WriteLine(e.Message);beginTransaction.Rollback();
}beginTransaction.Commit();

方式八 存储程序 没有返回值

sql

create proc p_users_insert
(
@nickName varchar(20),
@account varchar(20),
@pwd varchar(20)
) as
begin
insert into Users values(@nickName,@account,@pwd)
end

c#

string connectionString = ConfigurationManager.ConnectionStrings["connString"].ConnectionString;using  SqlConnection sqlConnection = new SqlConnection(connectionString);
sqlConnection.Open();
using SqlCommand sqlCommand = new SqlCommand("p_users_insert",sqlConnection);
sqlCommand.CommandType = CommandType.StoredProcedure;
SqlParameter[] sqlParameters =
{new SqlParameter("nickName","lisi"),new SqlParameter("account","lichongwen"),new SqlParameter("pwd","123")
};sqlCommand.Parameters.AddRange(sqlParameters);
sqlCommand.ExecuteNonQuery();

方式九 有返回值

sql

alter proc p_users_insert
(
@nickName varchar(20),
@account varchar(20),
@pwd varchar(20),
@code int output,
@msg varchar(20) output -- 输出参数
) as
begin
insert into Users values(@nickName,@account,@pwd);
set @msg = '添加成功';
set @code=1;
end

c#

string connectionString = ConfigurationManager.ConnectionStrings["connString"].ConnectionString;using  SqlConnection sqlConnection = new SqlConnection(connectionString);
sqlConnection.Open();
using SqlCommand sqlCommand = new SqlCommand("p_users_insert",sqlConnection);
sqlCommand.CommandType = CommandType.StoredProcedure;
SqlParameter[] sqlParameters =
{new SqlParameter("nickName","lisi"),new SqlParameter("account","lichongwen"),new SqlParameter("pwd","123"),new SqlParameter("code",SqlDbType.Int,4), // 不给输出参数设置值new SqlParameter("msg",SqlDbType.VarChar,20)
};sqlParameters[3].Direction = ParameterDirection.Output;
sqlParameters[4].Direction = ParameterDirection.Output;sqlCommand.Parameters.AddRange(sqlParameters);
sqlCommand.ExecuteNonQuery();
// 执行命令后才能够查询
Console.WriteLine("code的值为: "+sqlParameters[3].Value);
Console.WriteLine("msg的值为: "+sqlParameters[4].Value);

rider 创建mvc项目

配置文件填写位置

读取配置的插件

加上数据库连接

断点调试

MVC

appsetting
{"Logging": {"LogLevel": {"Default": "Information","Microsoft.AspNetCore": "Warning"}},"AllowedHosts": "*","ConnectionStrings": {"sqlServer": "server=192.168.10.116;uid=sa;pwd=qwe20211114.;database=database_2;pooling=true"}
}
public class HomeController : Controller
{private readonly ILogger<HomeController> _logger;private readonly IConfiguration _configuration;private readonly string _connectionString;public HomeController(ILogger<HomeController> logger, IConfiguration configuration){_logger = logger;_configuration = configuration;_connectionString = _configuration.GetConnectionString("sqlServer");}public IActionResult Index(){using   SqlConnection sqlConnection = new SqlConnection(_connectionString);using    SqlDataAdapter sqlDataAdapter = new SqlDataAdapter("select * from Users",sqlConnection);DataTable dataTable = new DataTable();sqlDataAdapter.Fill(dataTable);return View(dataTable);}
}

Views-Home-Index.cshtml

@using System.Data
@model System.Data.DataTable@{ViewData["Title"] = "Home Page";
}<div class="text-center"><h1 class="display-4">Welcome</h1><p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div><table class="table table-hover"><thead><tr><th>id</th><th>名称</th><th>价格</th></tr></thead><tbody>@foreach (DataRow row in Model.Rows){<tr><th>@row["Id"]</th><th>@row["NickName"]</th><th>@row["Account"]</th><th>@row["Pwd"]</th></tr>}</tbody>
</table>

DBHelper

public class DbHelper
{private static string? _connString;static DbHelper(){ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();var config = configurationBuilder.SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile(file =>{file.Path = "/appsettings.json";file.Optional = false;file.ReloadOnChange = true;}).Build();_connString = config.GetConnectionString("sqlServer");}private static SqlCommand PrepareCommand(SqlConnection connection,string sql,CommandType cmdType,params SqlParameter[]? parameters){using  SqlCommand sqlCommand = new SqlCommand(sql,connection);sqlCommand.CommandType = cmdType;if (parameters != null && parameters.Length > 0){sqlCommand.Parameters.AddRange(parameters);}return sqlCommand;}// 执行增删改操作public static int ExecuteNonQuery(string sql,CommandType cmdType = CommandType.Text,params SqlParameter[]? parameters){using   SqlConnection sqlConnection = new SqlConnection(_connString);sqlConnection.Open();return PrepareCommand(sqlConnection, sql, cmdType, parameters).ExecuteNonQuery();}private static SqlConnection GetSqlConnection(){using SqlConnection comm = new SqlConnection(_connString);comm.Open();return comm;}// 查询个数public static int ExecuteScalar(string sql,CommandType cmdType = CommandType.Text,params  SqlParameter[] parameters){return Convert.ToInt32(PrepareCommand(GetSqlConnection(), sql, cmdType, parameters).ExecuteScalar());}// 查询数据public static DataTable GetDataTable(string sql,CommandType cmdType = CommandType.Text,params SqlParameter[]? parameters){SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(sql,new SqlConnection(_connString));sqlDataAdapter.SelectCommand.CommandType = cmdType;if (parameters != null && parameters.Length > 0){sqlDataAdapter.SelectCommand.Parameters.AddRange(parameters);}DataTable dataTable = new DataTable();sqlDataAdapter.Fill(dataTable);return dataTable;}}

ado.net-All相关推荐

  1. ADO与ADO.NET的区别与介绍

    1. ADO与ADO.NET简介 ADO与ADO.NET既有相似也有区别,他们都能够编写对数据库服务器中的数据进行访问和操作的应用程序,并且易于使用.高速度.低内存支出和占用磁盘空间较少,支持用于建立 ...

  2. 使用ADO.NET 的最佳实践(zz)

    数据访问:使用 ADO.NET 的最佳实践(ADO.NET 技术文档) 发布日期: 4/1/2004 | 更新日期: 4/1/2004 摘要:编写 Microsoft ADO.NET 代码的最佳实践, ...

  3. 浅析ado.net获取数据库元数据信息

    写这个文章源于早先对ADO.Net获取数据库元数据上的认识,去年我在阅读ADO.Net Core Reference的时候曾经注意过DataSet的FillSchema的这个方法.这方面,在我之前的随 ...

  4. ADO.NET 2.0中的SqlCommand.ExecutePageReader

    http://blog.joycode.com/liuhuimiao/ 在.NET 2.0 PDC或Beta1中,可以看到SqlCommand对象新增了个ExecutePageReader方法,该方法 ...

  5. 用C#对ADO.NET数据库完成简单操作

    作者:李阳 http://oraasp.vicp.net/article/article.aspx?ID=21 数据库访问是程序中应用最普遍的部分.随着C#和ADO.NET的引入,这种操作变得更简单. ...

  6. ADO.NET 2.0 中的架构

    Bob Beauchemin DevelopMentor 适用于: Microsoft ADO.NET 2.0 Microsoft Visual Studio 2005 C# 编程语言 摘要:了解在 ...

  7. 4-1 ADO.NET简介

    第四章 ADO.NET数据库访问技术 本章内容 4-1  ADO.NET 简介 4-2 ADO.NET-插入.删除.修改.检索数据 4-3 DataGridView 控件 - 显示和操作数据 4-4 ...

  8. ADO.NET与ORM的比较(5):MyBatis实现CRUD

    说明:这是一个系列文章,在前面的四篇当中周公分别讲述了利用ADO.NET.NHibernate.Linq to SQL及EntityFramework来实现CRUD功能(C:Create/R:Read ...

  9. 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 ...

  10. 【TeeChart Pro ActiveX教程】(八):ADO数据库访问(上)

    2019独角兽企业重金招聘Python工程师标准>>> 下载TeeChart Pro ActiveX最新版本 介绍 将TeeChart控件连接到ADO.NET数据库可以在设计时使用T ...

最新文章

  1. C++ Primer 第三版 读书笔记
  2. VLC 关键模块结构分析
  3. 虚拟化--027 VMware vCenter Server Heartbeat 6.5安装教程
  4. shell中获取本机ip地址
  5. php worker,问题 php不支持worker工作模式的报错
  6. qt实现QLabel上显示的文字有描边
  7. fastcopy比正常复制快多少_高中三年,每个阶段考多少分才正常?快对比一下
  8. python 菜鸟-Python 运算符
  9. 论文降重修改句子软件
  10. linux主引导修复工具,Boot-Repair/引导修复工具
  11. 解析offsetHeight,clientHeight,scrollHeight之间的区别
  12. matlab实现长除法,【网安智库】基于长除法的BCH(15,7)译码算法
  13. 学习AccessibilityService实现微信抢红包插件
  14. 富士施乐Fuji Xerox DocuPrint M235 dw 驱动
  15. B站五面面经(附过程、答案)
  16. Android 仿百合网超火爆社交app首页滑动效果
  17. ubuntu安装搜狗输入法老是没中文怎么办
  18. JAVA微商城_O2O微门店SAAS系统
  19. LaTeX - 如何在图片说明(caption)中使用脚注(footnote)
  20. Android应用程序中的DVM和Linux中进程的区别

热门文章

  1. Cell Biolabs丨艾美捷 CytoSelect 白细胞迁移试验
  2. 少儿编程Scratch第二讲:奇妙的接球小游戏
  3. win10找不到wifi网络_笔记本无线网络找不到无线网络
  4. C#编程 LINQ查询
  5. 【2D游戏制作笔记】如何做出较好的角色操作手感
  6. 前端开发之HTML篇一
  7. 哈理工计算机学院学生会技术部,大学学生会技术部工作总结
  8. 19 html2canvas实现ArcGIS API for JavaScript 4.X截图功能
  9. 手机终端高级测试工程师经验总结
  10. 医学数据集及机器学习项目