C#-DataTable遍历的方式

https://www.cnblogs.com/soany/p/5297400.html

DataTable dt = dataSet.Tables[0];   
for(int i = 0 ; i < dt.Rows.Count ; i++)   
{   
   string strName = dt.Rows[i]["字段名"].ToString();   
}
foreach(DataRow myRow in myDataSet.Tables["temp"].Rows)   
{   
      var str = myRow[0].ToString();   
}
foeach(DataRow dr in dt.Rows)      
{      
     object value = dr["ColumnsName"];      
}
DataTable dt=new DataTable();      
foreach(DataRow dr in dt.Rows)      
{    
   for(int i=0;i<dt.Columns.Count;i++)    
   {    
        dr[i];    
   }      
}   

C# 如何获取SQL Server | SQLite中指定数据表的所有字段名和字段类型

我们继续研究SqlConnection.GetSchema 方法,
看看如何获取指定数据表的所有字段名和字段类型
SqlConnection.GetSchema方法有2个重载形式,
获取指定数据表的所有字段名和字段类型的秘密就在
GetSchema (String, String[])的第二个参数中。

public override DataTable GetSchema(
    string collectionName,
    string[] restrictionValues
)

参数collectionName指定要返回的架构的名称,取值为静态类 SqlClientMetaDataCollectionNames的成员,
如果要取列信息,则取值为SqlClientMetaDataCollectionNames.Columns。

关于SqlClientMetaDataCollectionNames类成员的详细信息参见

https://docs.microsoft.com/zh-cn/dotnet/api/system.data.sqlclient.sqlclientmetadatacollectionnames?redirectedfrom=MSDN&view=dotnet-plat-ext-3.1#fields

参数restrictionValues为请求架构的一组限制值,对于不同的架构集类型,有不同的写法。要具体了解,可以调用GetSchema(“Restrictions”) 方法。

针对SQL Server 数据库,restrictionValues的长度为4,其中
restrictionValues[0]为Catalog(数据库名),
restrictionValues[1]为Owner(所有者),
restrictionValues[2]为Table(表名),
restrictionValues[3]为Column(列名)。

我们要查询某张表中的列名等信息,则可以通过设置restrictionValues[2]=”SomeTableName”来实现。

实现代码如下:

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;

namespace scratchline.cn
{
    public struct Field
    {
        public string Name;
        public string Type;
    }

    public class scratchline
    {
        public List<Field>GetFileds(string connectionString, string tableName)
        {
            List<Field> _Fields = new List<Field>();
            SqlConnection _Connection = new SqlConnection(connectionString);
            try
            {
                _Connection.Open();

                string[] restrictionValues = new string[4];
                restrictionValues[0] = null; // Catalog
                restrictionValues[1] = null; // Owner
                restrictionValues[2] = tableName; // Table
                restrictionValues[3] = null; // Column

                using (DataTable dt = _Connection.GetSchema(SqlClientMetaDataCollectionNames.Columns, restrictionValues))
                {
                    foreach (DataRow dr in dt.Rows)
                    {
                        Field field;
                        field.Name = dr["column_name"].ToString();
                        field.Type = dr["data_type"].ToString();
                        _Fields.Add(field);
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                _Connection.Dispose();
            }

            return _Fields;
        }
    }
}

总结:SqlConnection.GetSchema方法用于获取数据库架构信息,通过不同参数的组合可实现各种数据架构信息的获取功能。

https://www.cnblogs.com/two/p/5224656.html

https://www.cnblogs.com/GmrBrian/p/6214756.html

C#-如何确定SQL Server 中数据表是否存在

SQL Server数据库的表名等信息属于架构集合的一部分,
ADO.NET中的SqlConnection类包含的 GetSchema 方法用于获取支持的架构集合列表,
因此,要确定SQL Server 数据库中表是否存在是否存在,
可通过SqlConnection.GetSchema(“Tables”)来获得,
该方法返回一个DataTable,
DataTable中包含table_catalog、table_schema、table_name、table_type等4列,table_name列即为数据表名。

示例代码如下

/// <summary> /// 判断数据库中名为tableName的表是否存在
        /// </summary>
        /// <param name="tableName">要查询的表名</param>
        /// <param name="connectionString">数据库连接字符串</param>
        /// <returns></returns>
        public bool Exist(string tableName, string connectionString)
        {
            bool bExist = false;
            SqlConnection _Connection = new SqlConnection(connectionString);
            try
            {
                _Connection.Open();
                using (DataTable dt = _Connection.GetSchema("Tables"))
                {
                    foreach (DataRow dr in dt.Rows)
                    {
                        if (string.Equals(tableName, dr[2].ToString()))
                        {
                            bExist = true;
                            break;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                _Connection.Dispose();
            }

            return bExist;
        }

要了解更多关于SQL Server架构集合的信息,可参看官方文档

https://www.cnblogs.com/two/p/5223650.html

SQLite-导出脚本 获得元数据

如何导出/导入SQLite表数据到脚本文件?

关键字:sqlite C# 导出脚本

编程方式导出

命令方式导出

https://blog.csdn.net/u013600225/article/details/53898697

执行“sqlite3.exe”,我们可能用到下面几个命令:
sqlite>.help
可以查看命令的帮助信息

假设我们有一个SQLite数据库文件,名为db.sqlite3,这个数据库中有2个表,分别为tb1和tb2,
我们导出整个数据库到db.SQL文件的方式:
Use “.open FILENAME” to reopen on a persistent database.
sqlite> .open db.sqlite3
sqlite> .output db.SQL
sqlite> .dump
sqlite> .exit

我们导出表tb1到db.SQL文件的方式:
Use “.open FILENAME” to reopen on a persistent database.
sqlite>.open db.sqlite3
sqlite>.output db.SQL
sqlite>.dump tb1
sqlite>.exit

https://blog.csdn.net/sophiemantela/article/details/100772957

https://tableconvert.com/

如何备份还原SQLite数据库?

可使用backup、restore和clone命令备份、恢复和复制SQLite数据库。

例如:

(1)备份数据库

    —通过在命令行窗口下执行sqlite3.exe以重新建立和SQLite的连接。
    sqlite3 test.db 
    sqlite> .backup ‘c:/test.db’
    sqlite> .exit

(2)恢复数据库

    sqlite3 test.db 
    sqlite> .restore ‘c:/test.db’

(3)复制数据库

    sqlite3 test.db 
    sqlite>.clone ‘c:/newtest.db’
    sqlite>.exit

编程实现

https://www.cnblogs.com/yaoxiaping/p/3770036.html

如何在EF中使用SQLite?

https://www.cnblogs.com/sdadx/p/7127098.html

如何读写SQLite-使用dataAdapter反向更新?

https://www.jb51.net/article/87974.htm

如何获取SQLite表的架构-表的字段名和字段类型?

https://www.cnblogs.com/wuhuacong/archive/2012/03/09/2387817.html

https://blog.csdn.net/MyNameIsXiaoLai/article/details/80883171

01—-查询sqlite中所有表

可用如下sql语句。原理是,sqlite中有一个内建表sqlite_master,这个表中存储这所有自建表的表名称等信息。

通过以下语句可查询出某个数据库的所有表名称信息

select name from sqlite_master where type=’table’ order by name;

02—-查询与判断列

通过以下语句可查询出某个表的所有字段信息

PRAGMA table_info([tablename])

比如:我想查看表StudentInfo的所有列信息,可以用下述代码。

PRAGMA table_info(StudentInfo)

Octopus-【思路】-jscode

jscode

            //1.0 思路
            //VH.PutSet(TagFields.PageName, PageName.Index);
            //VContent.Put(TagFields.JsCode, VH.OutString(string.Concat(this.PcMobile, "common/_Self_Js.html"), true));

面临问题:以前的的代码只能放在页面的底部,虽然可以每个页面载入自己的代码,但是代码摆放的位置不够灵活
而且代码没有压缩功能。

还可能由于页面没有载入完全导致js代码执行起来有问题。看了下兰亭的网页,他们把大量的js代码,甚至JQuery库都输出在了页面上

后来想了一下为什么这样做?
可以减少不必要的js额外请求;不会因为库没有下载下来导致一些代码没有执行
实现要求:使用${jscode}标签在页面中的任意位置,输出该页面自定义的js代码,并提供对代码的压缩功能

第一个版本思路
NVelocity有一个助手,在初始化完成之后指定一个模板的名字,就可以输出这个模板的字符串,有了字符串就可以对字符串进行压缩处理
所以尝试了下

#region 代码
            /*VelocityHelper vh = new VelocityHelper();
            string pathTemplate = ConfigHelper.BaseDirectory + "themes\\" + ConfigManager.GetConfig().Theme
                + ConfigManager.GetConfig().PCthemeDir.Replace("/", "\\") + "common\\";
            vh.Init(pathTemplate);
            vh.PutSet(TagFields.PageName, PageName.Index);
            string jsString = vh.OutString("_Self_Js.html");
            VContent.Put("jsstring", ZipHtml.GZipHtml(jsString));*/
            #endregion

第一:每个页面都要编写上面的代码增加了额外的开销
第二:麻烦
第三:手机模板和PC模板各自定义的js代码有可能不一样,所以_Self_Js.html不在同一个目录下,所以不行

第二个版本思路
尝试将VelocityHelper封装到页面的基类中去,变成一个静态的变量,这样不用增加额外的对象开销,而且内部的引擎不用做过多的初始化
在static HttpCustom()中尝试将其初始化,模板路径和HttpCustom路径保持一致,并且只初始化一次
这样在每个页面中 只需要调用就可以生成这个页面的js代码,同时传递了PcMobile目录,就可以为PC和Mobile生成各自的js代码 【比第一版的思路好多了】

VH.OutString(string.Concat(this.PcMobile, "common/vmjs.vm"), true)

坏处:每个页面都需要编写这个代码,代码还得需要编译
每个页面还需要PutSet这个页面的类型,才能动态的加载js代码
不灵活 也比较麻烦

第三版
既然可以在html中调用对象的方法,那么应该讲VH对象添加到数据上下文当中去
在html页面中调用这个方法
同时做进一步的封装string.Concat(this.PcMobile, “common/vmjs.vm”) 封装到 VH的内部处理
将PcMobile 封装成它的一个属性,在HttpCustom识别出访问设备,也就是PcMobile初始化之后
也将VH的PcMobile 初始化,如此一来
在页面中就可以这样调用

    $VH.PutSet("pagename","index")
    $VH.OutString(true)

好处:灵活了许多
pagename 不仅仅是系统中固定的那几个值了,可以自定义
而且可以自定义是否压缩js代码
到此完成!

总结:封装思想  确定需求