在有些业务场景中需要分批去取数据库表中的全部数据来进行处理,最简单的方法就是使用分页查询语句(偷懒以MySQL为例):
[sql] view plain copy print
select from datatable limit offset,amount
select from datatable limit offset,amount
这里就会有一个问题,随着offset值的越来越大,这条sql要扫描的表数据就会越来越多,因为要定位到offset这一行就需要扫描比offset小的所有行。显然在一张大数据量的表中,去这样做,性能就会出问题。为了避免这样的情形出现,我们自然会想到使用索引来解决,比如使用自增序列id进行分批取:
[sql] view plain copy print
select from datatable where id >= start and id<start+batchCount
select from datatable where id >= start and id<start+batchCount
这样我们对id建索引,然后分批去取,显然效果会高很多,但是如果自增序列由于删除等 *** 作变得不是连续,就会出现空执行和多执行的情况出现。要解决这个方法,我们就需要结合使用索引和分页的优势来处理:
[sql] view plain copy print
select from datatable where id >= start limit batchCount
select from datatable where id >= start limit batchCount
然后每次取回来我们再计算出起始id值,再去取下一批数据。这样就可以既避免了第一种不走索引,查询性能低下的问题,又解决了第二种id不连续,导致取回来的数据量不稳定导致浪费的问题了。
/// <summary>
/// 获得目标服务器所有数据库名
/// </summary>
/// <param name="serverName"></param>
/// <param name="userName"></param>
/// <param name="password"></param>
public void getDataBaseNameList(string serverName, string userName, string password)
{
SQLDMOApplication sqlApplication = new SQLDMOApplicationClass();
SQLDMOSQLServer sqlServer = new SQLDMOSQLServerClass();
sqlServerConnect(serverName, userName, password); // 连接服务器
foreach (SQLDMODatabase databBase in sqlServerDatabases)
{
if (databBaseName != null)
{
thisDataBaseTreeViewNodesAdd(databBaseName);
getDataBaseTableList(serverName, userName, password, databBaseName);
}
}
}
/// <summary>
/// 加载数据库中表
/// </summary>
/// <param name="serverName">服务器名</param>
/// <param name="userName">用户名</param>
/// <param name="password">密码</param>
/// <param name="dataBaseName">数据库名</param>
private void getDataBaseTableList(string serverName, string userName, string password, string dataBaseName)
{
SQLDMOSQLServer Server = new SQLDMOSQLServerClass();
//连接到服务器
ServerConnect(serverName, userName, password);
//对所有的数据库遍历,获得指定数据库
for (int i = 0; i < ServerDatabasesCount; i++)
{
//判断当前数据库是否是指定数据库
if (ServerDatabasesItem(i + 1, "dbo")Name == dataBaseName)
{
//获得指定数据库
SQLDMO_Database db = ServerDatabasesItem(i + 1, "dbo");
//获得指定数据库中的所有表
for (int j = 0; j < dbTablesCount; j++)
{
thisDataBaseTreeViewNodes[i]NodesAdd(dbTablesItem(j + 1, "dbo")Name);
}
}
}
}
/// <summary>
/// 获得表中所有列名
/// </summary>
/// <param name="serverName">服务器名</param>
/// <param name="userName">用户名</param>
/// <param name="password">密码</param>
/// <param name="tableName">表名</param>
/// <param name="dataBaseName">数据库名</param>
/// <returns></returns>
public string getRowListFromTable(string serverName, string userName, string password, string tableName, string dataBaseName)
{
string result = stringEmpty;
string connectionString = stringEmpty;
connectionString += "server=" + serverName;
connectionString += ";Pwd=" + password;
connectionString += ";UID=" + userName;
connectionString += ";Database=" + dataBaseName;
string commandString = stringEmpty;
commandString += "select name from syscolumns where id=object_id('";
commandString += tableName;
commandString += "')";
SqlConnection sqlConnection = new SqlConnection(connectionString);
SqlCommand sqlCommand = new SqlCommand(commandString, sqlConnection);
SqlDataAdapter dataAdapter = new SqlDataAdapter(commandString, sqlConnection);
DataSet dataSet = new DataSet();
dataAdapterFill(dataSet);
DataTable dataTable = dataSetTables[0];
// DataTable dataTable = sqlConnectionGetSchema("Tables");
foreach (DataRow row in dataTableRows)
{
result += row[0]ToString() + "-";
}
if (result != null)
{
return result;
}
else
{
return "0";
}
}
打开SQL企业管理器,把所涉及的两个数据库都连接上
打开旧数据库
表--
搞定了,数据表结构以及表中数据就全部复制过来了,至于你取部分数据什么的,自己通过SQL查询分析器去修改表中的数据吧
以上就是关于请教各位,如何分批获取数据库中数据全部的内容,包括:请教各位,如何分批获取数据库中数据、winform如何拿到一个服务器中所有数据库名称、关于SQL数据库提取数据的问题(如何提取数据库中的数据)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)