@ -115,7 +115,6 @@ namespace Apewer.Source
// 找出新列。
// 找出新列。
var newColumns = new List < ColumnAttribute > ( ) ;
var newColumns = new List < ColumnAttribute > ( ) ;
var newPrimaryKey = new List < PrimaryKey > ( ) ;
foreach ( var column in structure . Columns )
foreach ( var column in structure . Columns )
{
{
// 检查 Independent 特性。
// 检查 Independent 特性。
@ -326,7 +325,7 @@ namespace Apewer.Source
}
}
/// <summary>获取列信息。</summary>
/// <summary>获取列信息。</summary>
public ColumnInfo [ ] ColumnsInfo ( string tableName )
public virtual ColumnInfo [ ] ColumnsInfo ( string tableName )
{
{
if ( tableName . IsEmpty ( ) ) throw new ArgumentNullException ( nameof ( tableName ) ) ;
if ( tableName . IsEmpty ( ) ) throw new ArgumentNullException ( nameof ( tableName ) ) ;
var sql = $"select name, xtype, length from syscolumns where id = object_id('{tableName}') " ;
var sql = $"select name, xtype, length from syscolumns where id = object_id('{tableName}') " ;
@ -345,11 +344,47 @@ namespace Apewer.Source
}
}
}
}
/// <summary>创建索引。</summary>
/// <remarks>索引名称已存在或无索引字段时,不抛出异常。</remarks>
public virtual string Initialize ( TableIndex index )
{
if ( index = = null )
{
if ( ThrowAdoException ) throw new ArgumentNullException ( nameof ( index ) ) ;
return $"参数 {nameof(index)} 无效。" ;
}
// 查询索引是否存在,若存在则直接退出。
var sql1 = "select distinct i.name from sys.indexes i left join sys.all_objects o on i.object_id = o.object_id where i.name is not null and o.type = 'U' and i.is_primary_key = 0 and i.is_unique = 0" ;
var names = this . Column ( sql1 , false ) ;
var exist = names . Find ( x = > string . Equals ( x , index . Name , StringComparison . CurrentCultureIgnoreCase ) ) ;
if ( exist . NotEmpty ( ) ) return $"索引已存在。" ;
// 执行创建。
var fields = new List < string > ( ) ;
foreach ( var field in index . Fields )
{
if ( field . Order = = Order . Ascend ) fields . Add ( $"[{field.Column.Field}]" ) ;
else fields . Add ( $"[{field.Column.Field}] desc" ) ;
}
if ( fields . IsEmpty ( ) ) return "无索引字段。" ;
var sql2 = $"create index {index.Name} on [{index.Table.Name}] ({fields.Join(" , ")})" ;
var execute = Execute ( sql2 ) ;
if ( ! execute . Success )
{
if ( ThrowAdoException ) throw new SqlException ( execute . Message ) ;
return execute . Message ;
}
return null ;
}
/// <summary>批量插入,必须在 DataTable 中指定表名,或指定 tableName 参数。</summary>
/// <summary>批量插入,必须在 DataTable 中指定表名,或指定 tableName 参数。</summary>
/// <exception cref="ArgumentNullException"></exception>
/// <exception cref="ArgumentNullException"></exception>
/// <exception cref="ArgumentException"></exception>
/// <exception cref="ArgumentException"></exception>
/// <exception cref="Exception"></exception>
/// <exception cref="Exception"></exception>
public void BulkCopy ( DataTable table , string tableName = null )
public virtual v oid BulkCopy ( DataTable table , string tableName = null )
{
{
// 检查 table 参数。
// 检查 table 参数。
if ( table = = null ) throw new ArgumentNullException ( nameof ( table ) ) ;
if ( table = = null ) throw new ArgumentNullException ( nameof ( table ) ) ;
@ -389,7 +424,7 @@ namespace Apewer.Source
/// <param name="name">数据库名称。</param>
/// <param name="name">数据库名称。</param>
/// <param name="logMaxSizeMB">日志文件的最大 MB 数,指定非正数将不限制增长。</param>
/// <param name="logMaxSizeMB">日志文件的最大 MB 数,指定非正数将不限制增长。</param>
/// <returns>成功时候返回 NULL 值,失败时返回错误信息。</returns>
/// <returns>成功时候返回 NULL 值,失败时返回错误信息。</returns>
public string CreateStore ( string name , int logMaxSizeMB = 1 0 2 4 )
public virtual string CreateStore ( string name , int logMaxSizeMB = 1 0 2 4 )
{
{
var store = name . Escape ( ) . ToTrim ( ) ;
var store = name . Escape ( ) . ToTrim ( ) ;
if ( store . IsEmpty ( ) ) return "创建失败:未指定数据库名称。" ;
if ( store . IsEmpty ( ) ) return "创建失败:未指定数据库名称。" ;