修改SQL Server 2005默认数据库路径

将下面代码复制到查询分析器中,修改代码中的D:\MSSQL\Data为你想要设置的默认存放目录,然后执行即可。

--1.更改資料文件默認存放路經:
EXEC xp_instance_regwrite 
  @rootkey='HKEY_LOCAL_MACHINE', 
  @key='Software\Microsoft\MSSQLServer\MSSQLServer', 
  @value_name='DefaultData', 
  @type=REG_SZ, 
  @value='D:\MSSQL\Data'
GO
--2.更改日志文件默認存放路經:
EXEC master..xp_instance_regwrite 
  @rootkey='HKEY_LOCAL_MACHINE', 
  @key='Software\Microsoft\MSSQLServer\MSSQLServer', 
  @value_name='DefaultLog', 
  @type=REG_SZ, 
  @value='D:\MSSQL\Data'
GO

Sql Server 2005(64位) 连接Sql Server 2000(32位)

这个月总公司收购了一家小公司,这家小公司的数据库用的是32位的 Sql2000 ,已经使用很长一段时间了,系统也比较稳定。本着节约成本的原则,总公司保留原公司的一套管理系统,但要求重要数据每天上传到总公司的64位 Sql2005 数据库中去,这个简单的工作自然是交给我高升这样的小人物去完成了。

原想这是个很简单的差事,可是当我建好 LinkServer 以后却报出了如下错误,从此我的噩梦开始了:

OLE DB provider "SQLNCLI" for linked server "TEST_GAO" returned message "Unspecified error".
OLE DB provider "SQLNCLI" for linked server "TEST_GAO" returned message "The stored procedure required to complete this operation could not be found on the server. Please contact your system administrator.".
消息 7311,级别 16,状态 2,第 1 行
Cannot obtain the schema rowset "DBSCHEMA_TABLES_INFO" for OLE DB provider "SQLNCLI" for linked server "TEST_GAO". The provider supports the interface, but returns a failure code when it is used.

error 7311 : 安装在服务器"TEST_GAO" 的版本需要打升级吗?一查对方的服务器还是 sp3 的版本,于是下载了一个 sp4 的补丁,可是安装以后问题依旧。接着我又用自己的电脑上安装的 Sql2005 和远程的 Sql2000 建立了一个 LinkServer 测试了一下,结果很正常的就连上了,并且可以查询出数据。这个问题可真是奇怪了,难道发生了什么灵异事件?我自己的电脑和两台服务器都是安装的 windows server 2003 sp2 的操作系统,为什么同样是Sql2005我自己的就能连上,而服务器上的却不能连呢?

原来是因为32位的 Sql2000 升级到sp3或者sp4以后还需要手工执行补丁包内的 Instcat.sql 脚本才能连接上64位的 Sql2005 ,执行 cmd 进入命令行模式,输入如下语句,完成安装,这下 LinkServer 能够正常连接。

输入 : osql -U gaosheng -P sheng -S 127.0.0.1 -i C:/sql2ksp4/install/instcat.sql

-U:Sql2000的登陆名,要是具备管理权限的,最好是使用sa用户
-P:密码
-S:服务器名或IP地址
-i:脚本所在的路径及名称,注意大小写。

参考MSDN : http://support.microsoft.com/kb/906954/zh-tw 

 

LinkServer 建好以后下一步就是查数据写数据了,Sql语句写起来是很简单,可是开启事务后又出现问题了:

OLE DB provider "SQLNCLI" for linked server "TEST_GAO" returned message "The partner transaction manager has disabled its support for remote/network transactions.".
消息 7391,级别 16,状态 2,第 1 行
The operation could not be performed because OLE DB provider "SQLNCLI" for linked server "TEST_GAO" was unable to begin a distributed transaction.

error 7391 : 这很显然由于开启了事务,需要分布式事务协调器的支持。打开控制面板 – 管理工具 – 服务,将两台服务器上的 Distributed Transaction Coordinator (MSDTC) 服务开启,注意 MSDTC 服务的登陆名必须选择 NETWORK SERVICE 用户。然后设置高级选项,运行 dcomcnfg.exe ,进入组件服务,选择我的电脑右键属性,MSDTC – 安全配置,勾选:网络DTC访问,允许入站,允许出站,并且不要求进行验证。其他的可以根据需要选择,不是必须选项。

OLE DB provider "SQLNCLI" for linked server "TEST_GAO" returned message "No transaction is active.".
消息 7391,级别 16,状态 2,第 1 行
The operation could not be performed because OLE DB provider "SQLNCLI" for linked server "TEST_GAO" was unable to begin a distributed transaction.

error 7391 : 怎么还是这个错误,没有活动事务,无法启动分布式事务?高级配置也做过了,并且已经不要求进行验证了,难道这样还是不行?那就麻烦了,两台服务器并不在同一个域中,这样怎么让他相互信任呢,那就需要配置hosts文件了。

C:/WINDOWS/system32/drivers/etc/hosts ,在系统目录下找到这个隐藏的hosts系统文件,在文件的末尾加上对方的IP地址和主机名,如果服务器是集群的还要加上cluster的地址和虚拟IP地址,如:

136.16.25.79    GAOSHENG_Cluster
136.16.25.40    GAOSHENG_V1
136.16.25.80    GAOSHENG_DB1

第一个是Cluster主机的IP和主机名,第二个是虚拟的IP和主机名,第三个才是真实地址,加上前两个地址是为了保证服务器宕机以后,Cluster做了故障转移LinkServer还能正常使用。如果不是集群服务器只需要第三个真实地址就行了,这样双方就能互相信任,正常使用分布式事务了。注意这个hosts文件两边都要配置的,配置的是对方的IP地址和文件名。

OLE DB provider "SQLNCLI" for linked server "TEST_GAO" returned message "Cannot start more transactions on this session.".
消息 7395,级别 16,状态 2,第 1 行
Unable to start a nested transaction for OLE DB provider "SQLNCLI" for linked server "TEST_GAO". A nested transaction was required because the XACT_ABORT option was set to OFF.

还来!怎么还是有错误啊?
error 7395 : 还好直接告诉我怎么做了,在 Begin Transaction 前加上 SET XACT_ABORT ON 即可。

现在总算是不抱错了,查询修改也没问题了,问题终于解决了。建一个简单的 LinkServer 居然就出现了这么多的问题,一方面是我学艺不精,另一方面反映出来的是平时都是单服务器的操作,很多问题根本就是遇不到的,光有理论是远远不够的。不过最后能够解决问题也反映出我解决问题的能力还是有的,搞不懂就问人,搞得懂就答人,没有人懂还可以问神。( MSDN 和 CSDN )

 

总结:

在实际工作中会出现各种各样的问题,老是在一台服务器上测试和学习得到的东西毕竟有限,所以下次遇到问题千万要自己学着解决,要多锻炼一下自己解决问题的能力吧。如果没有多个服务器的环境学习,我这里推荐一个个 Microsoft 软件 Virtual PC ,这个软件可以在一台电脑上模拟很多台电脑出来,有各自的IP,对我们学习多服务器的操作很有帮助。

程序员不光要会学代码,最重要的还是分析问题解决问题的能力,具备这些能力才能算是一个合格的程序员。当然多多交流也是很有必要的,但前提是有问题自己先动脑子去想,然后才去交流。我高升在这里也很希望能和丛多的程序员们多交流交流技术,虽然现在水平不高,但一点一点的积累总会有所成就的。

 

写两个初次使用 Sql Server 2005 远程连接时最容易报的错误,凑点字数。

OLE DB provider "SQLNCLI" for linked server "TEST" returned message "Login timeout expired".
OLE DB provider "SQLNCLI" for linked server "TEST" returned message "An error has occurred while establishing a connection to the server. When connecting to SQL Server 2005, this failure may be caused by the fact that under the default settings SQL Server does not allow remote connections.".
Msg 65535, Level 16, State 1, Line 0
SQL Network Interfaces: Error Locating Server/Instance Specified [xFFFFFFFF].

这是新手在初次使用 Sql Server 2005 最最常见的一个错误,原因是默认的配置禁止了远程连接。很多对数据库不是很了解的人不了解如何去配置,所以 Sql Server 2005 提供了这个"外围应用配置器"中设置,把远程连接方式改成本地连接和远程连接,仅使用 TCP/IP ,注意这个选项改动以后是需要重启 SqlServer 的服务才能生效的。另外还有一个很重要的服务 SQL Server Browser ,开启了这个服务客户端才能正常访问。

Msg 15281, Level 16, State 1, Line 1
SQL Server blocked access to STATEMENT 'OpenRowset/OpenDatasource' of component 'Ad Hoc Distributed Queries' because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of 'Ad Hoc Distributed Queries' by using sp_configure. For more information about enabling 'Ad Hoc Distributed Queries', see "Surface Area Configuration" in SQL Server Books Online.

这个错误也是因为 Sql Server 2005 默认的配置的问题,默认关闭了使用 OpenRowset/OpenDatasource 的权限。解决也是在"外围应用配置器"中配置,将即席远程查询中的开启 OpenRowset/OpenDatasource 打勾。

当然这个也可以使用以下代码,执行如下代码:

sp_configure 'show advanced options', 1;  --开启高级配置
GO
RECONFIGURE;
GO
sp_configure 'Ad Hoc Distributed Queries', 1;  --开启即席查询
GO
RECONFIGURE;
GO
sp_configure 'show advanced options', 0;  --关闭高级配置
GO
RECONFIGURE;
GO

我高升水平有限难免会出现错误,希望大家批评指正,谢谢!

原文地址: http://blog.csdn.net/hb_gx/archive/2007/10/15/1826436.aspx

SQL SERVER 2005 Express支持的功能和组件

SQL SERVER 2005 Express 是SQL SERVER 2005经过简化的版本,因此它当然会有一些限制,如最大的并发用户数小于
等于12个,只能支持一个CPU,最大的内存量是1G等.

SQL SERVER 2005 Express的安装过程如下:
1. 下载Microsoft .NET Framework 2.0并安装
2. 下载 Microsoft SQL Server 2005 Express Edition 并安装
3. 下载SQL Server Management Studio Express 并安装,这是一个企业管理器,不知道为什么微软要将它与
SQL SERVER 的服务分开来发布.
4. 下载 Microsoft SQL Server 2005 Express Edition with Advanced Services 并安装
5. 下载Microsoft SQL Server 2005 Express Edition Toolkit并安装,是一个开发工具.
6. 还有一些其它可选的组件,如 SQL Server 2005 Samples 和联机帮助

原文链接:
http://msdn.microsoft.com/vstudio/express/sql/download/

 

SQL Server Express 支持 SQL Server 2005 的大多数功能。下表列出了支持的一些主要功能和组件。

存储过程

SQL Server 配置管理器

视图

复制(仅作为订阅服务器)

触发器

高级查询优化器

游标

SMO/RMO

sqlcmd 和 osql 实用工具

与 Visual Studio 2005 集成在一起

快照隔离级别

Service Broker(仅作为客户端)¹

本机 XML 支持,包括 XQuery 架构和 XML 架构

SQL CLR

Transact-SQL 语言支持

多个活动的结果集 (MARS)

专用管理员连接²

 

下表列出了此版本的 SQL Server Express 不支持的其他 SQL Server 2005 数据库功能。它还列出了早期版本的 SQL Server 中不支持的数据库功能。

SQL Server Express 不支持的 SQL Server 2005 功能 SQL Server Express 不支持的早期版本中 SQL Server 功能

数据库镜像

SQL Mail

在线还原

故障转移群集

数据库快照

分布式分区视图

并行索引操作

VIA 协议支持

镜像媒体集

日志传送

分区

并行 DBCC

地址窗口化扩展插件 (AWE)

并行创建索引

热添加内存

增强的预读和扫描

本机 HTTP SOAP 访问

索引视图(具体化视图)

SQL Mail 和数据库邮件

分区视图

联机索引操作

SQL Server 代理和 SQL Server Agent 服务

以下列表突出显示了 SQL Server Express 不支持的主要 SQL Server 2005 组件:

Reporting Services

Notification Services

Integration Services

Analysis Services

全文搜索

OLAP 服务/数据挖掘

C#怎么样备份access数据库【转】

File.Copy(Application.ExecutablePath+"\\..\\xxx.mdb","c:\\",true);

ACCESS是文件型数据库,并不是真正意义上的数据库。拷贝是一种方法。
如果数据比较多的话,你也可以这样做啊:将每个月的新数据拷贝到你备份数据库中,而不用全盘拷贝,这样效率可高多了

用ado 先建立一个空的mdb数据库
然后执行
select * into tbname in "a:\dbname.mdb"
from tbname
就可以将选中的表插入到新的库中去.
只是不能复制键.可用sql语句来更改键  

手头没有Microsoft Access,C#如何操作ACCESS数据库?
写一个小型程序,手头没有Microsoft Access,如何建立数据库,一切依然简单.
首先引用C:\Program Files\Common Files\System\ado\msadox.dll,该DLL包含ADOX命名空间;
接着引用C:\Program Files\Common Files\System\ado\msjro.dll,该DLL包含JRO命名空间
注意:如,导入dll不成功,手动把com组件 导入为 .net组件,在用vs.net工具导入

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.IO;
using ADOX;//该命名空间包含创建ACCESS的类(方法)--解决方案 ==> 引用 ==> 添加引用 ==> 游览找到.dll
using JRO;//该命名空间包含压缩ACCESS的类(方法)

namespace EC
{
/// <summary>
/// 数据库恢复和备份
/// </summary>
public class SqlBackObject
{
public SqlBackObject()
{
//
// TO


DO: 在此处添加构造函数逻辑
//
}

#region SQL数据库备份
/// <summary>
/// SQL数据库备份
/// </summary>
/// <param name="ServerIP">SQL服务器IP或(Localhost)</param>
/// <param name="LoginName">数据库登录名</param>
/// <param name="LoginPass">数据库登录密码</param>
/// <param name="DBName">数据库名</param>
/// <param name="BackPath">备份到的路径</param>
public static void SQLBACK(string ServerIP,string LoginName,string LoginPass,string DBName,string BackPath)
{
SQLDMO.Backup oBackup = new SQLDMO.BackupClass();
SQLDMO.SQLServer oSQLServer = new SQLDMO.SQLServerClass();
try
{
oSQLServer.LoginSecure = false;
oSQLServer.Connect(ServerIP, LoginName, LoginPass);
oBackup.Database = DBName;
oBackup.Files = BackPath;
oBackup.BackupSetName = DBName;
oBackup.BackupSetDescription = "数据库备份";
oBackup.Initialize = true;
oBackup.SQLBackup(oSQLServer);
}
catch (Exception e)
{
throw new Exception(e.ToString());
}
finally
{
oSQLServer.DisConnect();
}
}
#endregion

#region SQL恢复数据库
/// <summary>
/// SQL恢复数据库
/// </summary>
/// <param name="ServerIP">SQL服务器IP或(Localhost)</param>
/// <param name="LoginName">数据库登录名</param>
/// <param name="LoginPass">数据库登录密码</param>
/// <param name="DBName">要还原的数据库名</param>
// <param name="BackPath">数据库备份的路径</param>

public static void SQLDbRestore(string ServerIP,string LoginName,string LoginPass,string DBName,string BackPath)
{

SQLDMO.Restore orestore = new SQLDMO.RestoreClass();
SQLDMO.SQLServer oSQLServer = new SQLDMO.SQLServerClass();
try
{
oSQLServer.LoginSecure = false;
oSQLServer.Connect(ServerIP, LoginName, LoginPass);
orestore.Action = SQLDMO.SQLDMO_RESTORE_TYPE.SQLDMORestore_Database;
orestore.Database = DBName;
orestore.Files = BackPath;
orestore.FileNumber = 1;
orestore.ReplaceDatabase = true;
orestore.SQLRestore(oSQLServer);

}
catch (Exception e)
{
throw new Exception(e.ToString());
}
finally
{
oSQLServer.DisConnect();
}
}
#endregion

#region 根据指定的文件名称创建Access数据库
/// <summary>
/// 根据指定的文件名称创建数据
/// </summary>
/// <param name="DBPath">绝对路径+文件名称</param>
public static void CreateAccess(string DBPath)
{
if (File.Exists(DBPath))//检查数据库是否已存在
{
throw new Exception("目标数据库已存在,无法创建");
}
DBPath = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+DBPath;
//创建一个CatalogClass对象实例
ADOX.CatalogClass cat = new ADOX.CatalogClass();
//使用CatalogClass对象的Create方法创建ACCESS数据库
cat.Create(DBPath);
}
#endregion

#region 压缩Access数据库
/// <summary>
/// 压缩Access数据库
/// </summary>
/// <param name="DBPath">数据库绝对路径</param>
public static void CompactAccess(string DBPath)
{
if (!File.Exists(DBPath))
{
throw new Exception("目标数据库不存在,无法压缩");
}

//声明临时数据库名称
string temp = DateTime.Now.Year.ToString();
temp += DateTime.Now.Month.ToString();
temp += DateTime.Now.Day.ToString();
temp += DateTime.Now.Hour.ToString();
temp += DateTime.Now.Minute.ToString();


temp += DateTime.Now.Second.ToString() + ".bak";
temp = DBPath.Substring(0, DBPath.LastIndexOf("\\") + 1) + temp;
//定义临时数据库的连接字符串
string temp2 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+temp;
//定义目标数据库的连接字符串
string DBPath2 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+DBPath;
//创建一个JetEngineClass对象的实例
JRO.JetEngineClass jt = new JRO.JetEngineClass();
//使用JetEngineClass对象的CompactDatabase方法压缩修复数据库
jt.CompactDatabase(DBPath2, temp2);
//拷贝临时数据库到目标数据库(覆盖)
File.Copy(temp, DBPath, true);
//最后删除临时数据库
File.Delete(temp);
}
#endregion

#region 备份Access数据库
/// <summary>
/// 备份Access数据库
/// </summary>
/// <param name="srcPath">要备份的数据库绝对路径</param>
/// <param name="aimPath">备份到的数据库绝对路径</param>
/// <returns></returns>
public static void Backup(string srcPath,string aimPath)
{
if (!File.Exists(srcPath))
{
throw new Exception("源数据库不存在,无法备份");
}
try
{
File.Copy(srcPath,aimPath,true);

}
catch(IOException iXP)
{
throw new Exception(ixp.ToString());
}
}

#endregion

#region 还原Access数据库
/// <summary>
/// 还原Access数据库
/// </summary>
/// <param name="bakPath">备份的数据库绝对路径</param>
/// <param name="dbPath">要还原的数据库绝对路径</param>
public static void RecoverAccess(string bakPath,string dbPath)
{
if (!File.Exists(bakPath))
{
throw new Exception("备份数据库不存在,无法还原");
}
try
{
File.Copy(bakPath, dbPath, true);
}
catch (IOException ixp)
{
throw new Exception(ixp.ToString());
}
}
#endregion
}
}

C# 判断 检测 access 建库 建表 文件是否存在等 数据操作 使用 ADOX

  1. 创建数据库

  2. 判断表是否存在

  3. 创建表

1.    #region access数据库操作 之 创建数据库
        private void creatMDB(string dbName)
        {
            ADOX.CatalogClass cat = new ADOX.CatalogClass();
            cat.Create("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + dbName + ";");
            //ADOX.Catalog cat = new Catalog();
            //cat.Create("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + dbName + ";Jet OLEDB:Engine Type=5");s
        }
        #endregion

2.     #region access数据库操作 之 判断数据库中是否存在某表
        public bool GetTables(OleDbConnection conn)
        {
            int result = 0;
            DataTable schemaTable = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,
                                                             new object[] {null, null, null, "TABLE"});


            if (schemaTable != null)
            {

                for (Int32 row = 0; row < schemaTable.Rows.Count; row++)
                {
                    string col_name = schemaTable.Rows[row]["TABLE_NAME"].ToString();
                    if (col_name == "MyChooseStock")
                    {
                        result++;
                    }
                }
            }
            if (result == 0)
                return false;
            return true;
        }
        #endregion

3.     #region access数据库操作 之 创建表
        //新建mdb的表,C#操作Access之创建表 
        //mdbHead是一个ArrayList,存储的是table表中的具体列名。 
        private void CreateMDBTable(string mdbPath, string tableName, ArrayList mdbHead)
        {
            ADOX.CatalogClass cat = new ADOX.CatalogClass();
            string sAccessConnection = @"Provider=Microsoft.Jet.OLEDB.4.0;  Data Source=" + mdbPath;
            connection = new OleDbConnection(sAccessConnection);
            connection.Open();
             ADODB.Connection cn = new ADODB.Connection();
            cn.Open(sAccessConnection, null, null, -1);

            cat.ActiveConnection = cn;
            //新建一个表,C#操作Access之创建表
            ADOX.TableClass tbl = new ADOX.TableClass();
            tbl.ParentCatalog = cat;//目录
            tbl.Name = tableName;

            //增加一个自动增长的字段
            ADOX.ColumnClass col = new ADOX.ColumnClass();
            col.ParentCatalog = cat;
            col.Type = ADOX.DataTypeEnum.adInteger; // 必须先设置字段类型
            col.Name = "id";
            col.Properties["Jet OLEDB:Allow Zero Length"].Value = false;
            col.Properties["AutoIncrement"].Value = true;
            tbl.Columns.Append(col, ADOX.DataTypeEnum.adInteger, 0);

            // 增加一个文本字段
            int size = mdbHead.Count;
            for (int i = 0; i < size; i++)
            {
                //增加一个文本字段       
                ADOX.ColumnClass col2 = new ADOX.ColumnClass();
                col2.ParentCatalog = cat;
                col2.Name = mdbHead[i].ToString(); //列的名称    
                col2.Properties["Jet OLEDB:Allow Zero Length"].Value = false;
                tbl.Columns.Append(col2, ADOX.DataTypeEnum.adVarWChar, 500);
            }
            //设置主键   
            tbl.Keys.Append("PrimaryKey", ADOX.KeyTypeEnum.adKeyPrimary, "id", "", "");

            cat.Tables.Append(tbl); //这句把表加入数据库(非常重要)  ,C#操作Access之创建表
            tbl = null;
            cat = null;
            connection.Close();
        }
        #endregion

4.

using System.Data;
using System.Data.OleDb;

using ADOX; //需添加 Microsoft ADO Ext. 6.0 ***Security

protected override void buttonOk_Click(object sender, EventArgs e)
        {      

  private OleDbConnection connection;     

   private OleDbDataAdapter dataAdapter;

                      string systemPath = Environment.GetFolderPath(Environment.SpecialFolder.System);
                        if (Directory.Exists(systemPath + "\\data") == false)//如果不存在就创建file文件夹
                        {
                            Directory.CreateDirectory(systemPath + "\\data");
                        }
                        string favoriteStockMDB = systemPath + "\\data\\Data.mdb";
                        if (!File.Exists(favoriteStockMDB)) creatMDB(favoriteStockMDB);//判断是否存在数据库,不存在,则创建
                        connection =
                            new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source= " + favoriteStockMDB);
                        connection.Open();

                        if (!GetTables(connection))
                        {
                            string table_name = "MyChooseStock";
                            ArrayList col_names = new ArrayList();
                            col_names.Add("StockCode");
                            CreateMDBTable(favoriteStockMDB, table_name, col_names);
                            connection.Open();
                        }
                        dataAdapter = new OleDbDataAdapter("select  * from MyChooseStock", connection);
                        DataSet dataSetSelect = new DataSet();
                        dataAdapter.Fill(dataSetSelect, "sel");
                        DataTable dataTable = dataSetSelect.Tables["sel"];
                        for (int i = 0; i < dataTable.Rows.Count; i++)
                        {
                            listSelect.Add(dataTable.Rows[i][1].ToString());
                        }
                        OleDbCommand insertCommand = connection.CreateCommand();
                        insertCommand.CommandText = "insert into MyChooseStock(StockCode) values (?)";
                        insertCommand.Parameters.Add("StockCode", OleDbType.VarChar, 1024);
                        insertCommand.Prepare();
                        insertCommand.Parameters[0].Value = list[0];
                        Int32 row = insertCommand.ExecuteNonQuery();
                        if (row != 0)
                        {
                            MessageBoxHelper.ShowInfo("收藏成功!");
                        }
                        else
                        {
                            MessageBoxHelper.ShowInfo("收藏失败!");
                        }
                        connection.Close();

}

c# sql 数据库 多表关联 根据一个表的字段 读取另一个表的内容

数据库中有3个表,分别是:
1. Person
字段为: ID;NAME;JOBID;CLASSID
              1    李明   1           1
              2    张三   2           2
              3    李四   2           1
              4    王五   3           2
              5    赵六   1           1
2. Job
字段为:ID;JOBNAME
         1       工程师
         2       财务师
         3       预算师
3. Class
字段为:ID;CLASSNAME
            1         分组1
            2         分组2
            3         分组3

目前想将Person表的所有内容存入DATASET的TABLE中,但希望根据JOBID和CLASSID获取其他2个表的内容后,将其相对应的内容写入,并且分别建立别名。那么SQL语句要如何写呢?看下面:

string str = "select top 100 Person.ID as 序号,JOBNAME as 工作职务,CLASSNAME as 分组信息 from Person,Job,Class where Person.JOBID = Job.ID and Person.CLASSID = Class.ID  order by Person.ID desc";

分析一下以上的代码,首先在top 100后面的就是要选择的字段名,这里要注意,ID这个字段名是3个表都有的,所以必须要以表名.字段名的形式表现,也就是Person.ID,来表示Person表中的这个ID,如果不标明,sql语句会出错。接下来,后面这个JOBNAME就是表Job中的字段名,而不是Person表中的那个JOBID的内容,同理,CLASSNAME也是表Class中的。因为这些是我们要真正取出来的内容。

from是从哪些表中取出以上这些值,这里就牵扯到了3个表,把这3个表用“,”分割开。

where 来判断多表之间的关系,也就是主键和外键的关联。

最后是按照Person.ID的值进行倒序排列,正序则是asc。

当一条SQL语句出错的时候,也要注意是否该空格的地方空格了。

最后,要特别注意的是,如果没有建立物理主键外键关联,那么当Job表或者Class表中的内容被删除后,主表就会出错,这个在程序中一定要进行判断。 

SQL 语句的添加、删除、修改!

SQL语句的添加、删除、修改虽然有如下很多种方法,但在使用过程中还是不够用,不知是否有高手把更多灵活的使用方法贡献出来?

添加、删除、修改使用db.Execute(Sql)命令执行操作
╔—————-╗
☆ 数据记录筛选 ☆
╚—————-╝
注意:单双引号的用法可能有误(没有测式)

Sql = "Select Distinct 字段名 From 数据表"
Distinct函数,查询数据库存表内不重复的记录

Sql = "Select Count(*) From 数据表 where 字段名1>#18:0:0# and 字段名1< #19:00# "
count函数,查询数库表内有多少条记录,“字段名1”是指同一字段
例:
set rs=conn.execute("select count(id) as idnum from news")
response.write rs("idnum")

sql="select * from 数据表 where 字段名 between 值1 and 值2" 
Sql="select * from 数据表 where 字段名 between #2003-8-10# and #2003-8-12#"
在日期类数值为2003-8-10 19:55:08 的字段里查找2003-8-10至2003-8-12的所有记录,而不管是几点几分。

select * from tb_name where datetime between #2003-8-10# and #2003-8-12#
字段里面的数据格式为:2003-8-10 19:55:08,通过sql查出2003-8-10至2003-8-12的所有纪录,而不管是几点几分。

Sql="select * from 数据表 where 字段名=字段值 order by 字段名 [desc]" 

Sql="select * from 数据表 where 字段名 like '%字段值%' order by 字段名 [desc]" 
模糊查询

Sql="select top 10 * from 数据表 where 字段名 order by 字段名 [desc]" 
查找数据库中前10记录

Sql="select top n * form 数据表 order by newid()"
随机取出数据库中的若干条记录的方法
top n,n就是要取出的记录数

Sql="select * from 数据表 where 字段名 in ('值1','值2','值3')"

╔—————-╗
☆ 添加数据记录 ☆
╚—————-╝
sql="insert into 数据表 (字段1,字段2,字段3 …) valuess (值1,值2,值3 …)" 

sql="insert into 数据表 valuess (值1,值2,值3 …)" 
不指定具体字段名表示将按照数据表中字段的顺序,依次添加

sql="insert into 目标数据表 select * from 源数据表" 
把源数据表的记录添加到目标数据表

╔—————-╗
☆ 更新数据记录 ☆
╚—————-╝
Sql="update 数据表 set 字段名=字段值 where 条件表达式" 

Sql="update 数据表 set 字段1=值1,字段2=值2 …… 字段n=值n where 条件表达式" 

Sql="update 数据表 set 字段1=值1,字段2=值2 …… 字段n=值n " 
没有条件则更新整个数据表中的指定字段值

╔—————-╗
☆ 删除数据记录 ☆
╚—————-╝
Sql="delete from 数据表 where 条件表达式" 

Sql="delete from 数据表" 
没有条件将删除数据表中所有记录)

╔——————–╗
☆ 数据记录统计函数 ☆
╚——————–╝
AVG(字段名) 得出一个表格栏平均值 
COUNT(*|字段名) 对数据行数的统计或对某一栏有值的数据行数统计 
MAX(字段名) 取得一个表格栏最大的值 
MIN(字段名) 取得一个表格栏最小的值 
SUM(字段名) 把数据栏的值相加 

引用以上函数的方法: 
sql="select sum(字段名) as 别名 from 数据表 where 条件表达式" 
set rs=conn.excute(sql) 
用 rs("别名") 获取统的计值,其它函数运用同上。 

╔———————-╗
☆ 数据表的建立和删除 ☆
╚———————-╝
Create TABLE 数据表名称(字段1 类型1(长度),字段2 类型2(长度) …… ) 
例:Create TABLE tab01(name varchar(50),datetime default now()) 
Drop TABLE 数据表名称 (永久性删除一个数据表) 

╔——————–╗
☆ 记录集对象的方法 ☆
╚——————–╝
rs.movenext 将记录指针从当前的位置向下移一行 
rs.moveprevious 将记录指针从当前的位置向上移一行 
rs.movefirst 将记录指针移到数据表第一行 
rs.movelast 将记录指针移到数据表最后一行 
rs.absoluteposition=N 将记录指针移到数据表第N行 
rs.absolutepage=N 将记录指针移到第N页的第一行 
rs.pagesize=N 设置每页为N条记录 
rs.pagecount 根据 pagesize 的设置返回总页数 
rs.recordcount 返回记录总数 
rs.bof 返回记录指针是否超出数据表首端,true表示是,false为否 
rs.eof 返回记录指针是否超出数据表末端,true表示是,false为否 
rs.delete 删除当前记录,但记录指针不会向下移动 
rs.addnew 添加记录到数据表末端 
rs.update 更新数据表记录 

c# access数据库 条件为spring 字符串 的sql语句写法

OleDbDataReader dr2 = conn.read("select * from Person where class = '"+ Convert.ToString(dr1["class"]) +"'");

上面是指定了where的条件为spring的值,我们可以先写成如下形式

OleDbDataReader dr2 = conn.read("select * from Person where class = '"+ +"'");

括号内先是双引号"select * from Person where class =",如果条件是等于字符串,就是string类型,那么写成"select * from Person where class = '李明'",李明用单引号括起来。

如果李明是一个变量,那么基本语句是 "select * from Person where class = ‘“+ +"'",注意最外侧是双引号,=等于的后面先跟着2个单引号,单引号内再写上2个双引号,双引号内用两个+号连接,2个+号内部就是要放入的变量。