十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
《基于.NETWinForm+ADO.NET的金山打字软件游戏教程》 129.6元 本系列是基于SQL SERVER数据库和C# Winform技术来完成的,整个项目紧紧贴近目前社会上应聘.Net方向软件工程师应聘技术条件完成,通过对熟悉ADO.NET数据库编程设计模式,Winform(Label/Button/TextBox/ListBox/ListView/ProgressBar)等基本控件的使用以及委托,事件模型的简介,力求达到每一个同学可以在学完本系列视频就可以完成一个出色程序的目标。并同时达到企业对中级.Net工程师的用人标准
成都创新互联主营永嘉网站建设的网络公司,主营网站建设方案,app软件定制开发,永嘉h5小程序设计搭建,永嘉网站营销推广欢迎永嘉等地区企业咨询
目前SQL Server数据库作为微软一款优秀的RDBMS,其本身启动的时候是很少出问题的,我们在平时用的时候,很少关注起启动过程,或者很少了解其底层运行过程,大部分的过程只关注其内部的表、存储过程、视图、函数等一系列应用方式,而当有一天它运行的正常的时候突然启动不起来了,这时候就束手无策了,能做的或许只能是重装、配置、还原等,但这一个过程其实是一个非常耗时的过程,尤其当我们面对是庞大的生产库的时候,可能在这火烧眉毛的时刻,是不允许你再重搭建一套环境的。
所以作为一个合格的数据库使用者,我们要了解其启动、运行过程的事情,一旦发生问题,我们也能及时定位,迅速解决。
闲言少叙,我们进入本篇的正题。
SQL Server本身就是一个Windows服务,每一个实例对应的就是一个sqlserver.exe进程。这是一个可执行的文件,默认就放在SQL Server的安装目录下,当我们启动的时候,就是直接调用这个文件,然后启动这个服务。
第一部分、SQL Server实例启动的方法和启动所发生的问题
SQL Server实例分为下面几种启动方法:
(1)在Windows服务控制台里手动启动,或者自动启动(默认),这个也是最常用的方式
(2)第二种方式是SQL Server本身自己提供的启动方式,我们这里可以手动启动
(3)在SQL Server的SSMS里面手动启动它,这个方式一般大部分利用这种方式进行手动重启
(4)通过Windows命令窗口,用'net start'命令手动启动,这种方法也可以用
以上这几种方式都可以启动SQL Sever,
第二部分、SQL Server实例启动的详细过程以及所发生的问题项
第一步、检查注册表项
当一个sqlserver.exe文件开始启动的时候,首先要干的第一件事就是先检查它的配置信息存放于注册表的值项
比较重要的几个键值有下面几个:
这里的
AuditLevel:其实就是SQL 如何记录用户登录记录;
LoginMode:是SQL Server服务器身份验证方式等;
BackupDirectory:默认的备份路径等信息;
关于注册表信息简要了解即可,不建议做任何修改,当然这些值的信息默认在SQL Server中都能设置:
在不修改注册表的情况下,一般这一步的启动顺序一般不会出现问题,当然出现问题了也通常没有办法解决,大部分的解决方式只有重装了。
但这一步骤,通常出现以下两个个问题通常是可以解决的:
1启动账号权限问题
如果我们启动SQL Server的进程使用的账号连读注册表的权限都没有,那这个服务是怎么也启动不了的,通常这时候连SQL 的错误日志都没有能力生成出来。
这时候我们该如何发现呢,虽然这时候它没有能力创建SQL 的错误日志,但是它在Windows层面留下了痕迹,我们来看:
我将服务启动账号设置成gust来宾账号,来启动该服务
这时候会产生以下错误信息:
在Windows的日志信息里也会产生一条错误日志记录:
这里的拒绝访问指的就是拒绝访问注册表信息了。
解决方法:
此问题的解决方式就很简单了,只需要将当然的用户提权到SQL Server服务的启动账号就行了,提权的方式也很简单,只需要添加到SQL的本地用户的启动服务组就可以了。
当然,也可以直接换一个更高级别的用户登录。一般默认都用的超级管理员账户。
2访问日志和文件夹出现问题
默认在SQL Server启动的时候会创建一个启动日志文件,记录所有正确的日志信息,当然也包括错误的日志信息,如果这时候找不到这个日志信息的路径,或者已经存在一个日志,但是日志被锁定了(某些NB的杀毒软件擅长干这个),这时候这个服务也是启动不了的,同样也创建不出SQL Server的日志文件,这时候我们还得借助于Windows平台本身,来解决。
SQL Server启动的创建的日志文件路径,同样存在于注册表项里,我们来看这个参数:
这里我们故意改成一个错误的路径,来启动下看看:
会产生以下错误
错误说明的很清楚。
解决方法:
这个问题解决起来也很简单,只需要检查好该路径,确保路径下的文件正确就可以。
列出以下经典SQL教程下载,如果想获得更多更新的SQL教程请到进入SQL教程列表,更有经典SQL视频教程等着您。01 SQL Server 2000 看图教程 17M 推荐 02 SQL server 2000自学教程 7M 推荐 03 SQL Server 7参考手册 96M 04 SQL Server精华 4.53M 05 SQL Server 2000数据库开发从零开始 10M 推荐 06 SQL Server 2000数据库管理 16M 07 战胜SQL Server必做练习50题 16M 推荐 08 SQL SERVER 2000培训教程 4.8M 09 sql server2000实用工具大全 14M 10 SQL基础教程 6.02M 推荐 11 10分钟学会SQL 324K 12 Microsoft SQL Server7 数据库技术指南 16M 13 Sql Server7教程 39M 14 Microsoft SQL Server高级编程管理指南 7.5M 15 SQL7.0教程 19.85M 16 SQL Server 2000编程员指南 32M 17 SQL Server 2000数据库开发 13M 18 轻松搞定SQL Server 2000程序设计 10M 19 SQL入门,使用与高级使用篇 55K 20 SQL Server 7.0 数据库管理与应用开发 20.86M 21 SQL Server 2000开发指南 15M 22 SQL_Server_2000编程人员指南 36M 23 SQL Server 2000开发者指南 8.1M 24 21天学会Sql 2.1M 25 SQLServer7关系数据库系统管理与开发 14.3M 26 SQL SERVER 7.24 学时教程 14M 27 SQL系统管理员新起点--7.0实用教程 4.88M 28 sql_server_7编程技术内幕 19.6M 29 Microsoft SQL Server 管理员手册 6M 30 SQL Server2000 管理手册 9.4M 31 SQL 2000 简明教程 4.77M 32 SQL Server 2000 学习教程 10.5M 33 SQL7.0最新教程 38M 34 SQL Server 2000菜鸟进阶 408K 连接
using System;
using System.Data;
using System.Data.SqlClient;
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.Collections;
/// summary
/// 对数据库操作的类
/// /summary
public class DataBase
{
private SqlConnection myCon;
public DataBase()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
/// summary
/// 获取连接字符串
/// /summary
/// returns/returns
private string GetConnectionString()
{
string strConn = System.Configuration.ConfigurationManager.ConnectionStrings["ConString"].ConnectionString;
return strConn;
}
/// summary
/// 打开数据库连接
/// /summary
/// returns打开是否成功/returns
private bool Open()
{
string strCon=GetConnectionString();
if (String.IsNullOrEmpty(strCon) != true)
{
myCon = new SqlConnection(strCon);
}
else
{
return false;
}
try
{
myCon.Open();
return true;
}
catch
{
return false;
}
}
/// summary
/// 关闭对数据库的连接
/// /summary
private void Close()
{
if(myCon.State == ConnectionState.Open)
{
myCon.Close();
myCon.Dispose();
}
}
/// summary
/// 执行无返回值的查询语句
/// /summary
/// param name="strSql"要执行的数据库字符串/param
/// returns执行是否成功/returns
public bool ExecNoQuery(string strSql)
{
if (Open())
{
SqlCommand myCom = new SqlCommand(strSql, myCon);
try
{
myCom.ExecuteNonQuery();
Close();
return true;
}
catch
{
Close();
return false;
}
}
else
{
return false;
}
}
/// summary
/// 返回首行首列
/// /summary
/// param name="strSql"查询语句/param
/// returns执行的结果,是一个Object的值,根据具体情况转换/returns
public object ExecNoScalar(string strSql)
{
if (Open())
{
SqlCommand myCom = new SqlCommand(strSql, myCon);
try
{
object returnValue = myCom.ExecuteScalar();
Close();
return returnValue;
}
catch
{
Close();
return null;
}
}
else
{
return null;
}
}
/// summary
/// 执行一个返回SqlDataReader的查询
/// /summary
/// param name="strSql"查询语句/param
/// returns/returns
public SqlDataReader ExecReader(string strSql)
{
if (Open())
{
SqlCommand myCom = new SqlCommand(strSql, myCon);
try
{
SqlDataReader dr = myCom.ExecuteReader(CommandBehavior.CloseConnection);
//关闭dr的同时,关闭数据库连接
return dr;
}
catch (Exception ex)
{
return null;
System.Web.HttpContext.Current.Response.Write(ex.Message);
System.Web.HttpContext.Current.Response.End();
}
}
else
{
return null;
}
}
/// summary
/// 将DataReader转换为DataTable
/// /summary
/// param name="reader"要被转换的DataReader/param
/// returns转换后的DataTable/returns
public static DataTable ConvertDataReaderToDataTable(IDataReader reader)
{
DataTable objDataTable = new DataTable();
int intFieldCount = reader.FieldCount;
//将列名添加到DataTable中
for (int intCounter = 0; intCounter intFieldCount; ++intCounter)
{
objDataTable.Columns.Add(reader.GetName(intCounter), reader.GetFieldType(intCounter));
}
//装入内容
objDataTable.BeginLoadData();
object[] objValues = new object[intFieldCount];
while (reader.Read())
{
reader.GetValues(objValues);
objDataTable.LoadDataRow(objValues, true);
}
reader.Close();
objDataTable.EndLoadData();
return objDataTable;
}
/// summary
/// 创建存储过程命令
/// /summary
/// param name="procName"存储过程名/param
/// param name="prams"存储过程参数列表/param
/// returns完整的存储过程命令/returns
private SqlCommand CreateCommand(string procName, SqlParameter[] prams)
{
// 确认打开连接
Open();
SqlCommand cmd = new SqlCommand(procName, myCon);
cmd.CommandType = CommandType.StoredProcedure;
// 依次把参数传入存储过程
if (prams != null)
{
foreach (SqlParameter parameter in prams)
cmd.Parameters.Add(parameter);
}
// 加入返回参数
return cmd;
}
/// summary
/// 执行存储过程
/// /summary
/// param name="procName"存储过程名称/param
/// param name="dataReader"返回的数据集合/param
public SqlDataReader RunProc(string procName)
{
SqlCommand cmd = CreateCommand(procName, null);
SqlDataReader dr = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
//return (int)cmd.Parameters["ReturnValue"].Value;
return dr;
}
/// summary
/// 执行存储过程
/// /summary
/// param name="procName"存储过程名称/param
/// param name="prams"参数数组/param
/// returns返回的数据集合/returns
public SqlDataReader RunProc(string procName, SqlParameter[] prams)
{
SqlCommand cmd = CreateCommand(procName, prams);
SqlDataReader dr = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
//return (int)cmd.Parameters["ReturnValue"].Value;
return dr;
}
/// summary
/// 根据查询语句返回
/// /summary
/// param name="QuerySentence"查询语句/param
/// returns返回数据表/returns
public DataTable GetDataTable(string QuerySentence)
{
SqlConnection con=new SqlConnection ();
con.ConnectionString =GetConnectionString();
SqlDataAdapter ad = new SqlDataAdapter(QuerySentence, con);
DataTable dtable = new DataTable();
ad.Fill(dtable);
return dtable;
}
}
1.用"a"是为了方便你输入,a就是authors,你不用a也可以,但用到authors 的地方你都得输这个字段,感觉麻烦。“authors as a ”的意思就是用 a替代 authors.
2.join 就是进行连接。
jion 语句有三种,inner join, left outer join 和 right outer join 都可以简写,分别为jion,left join,right jion。
jion语句可以用来组合两个表中的记录,只要在公共字段之中有相符的值即可,该语句联合两个表查询得到的结果是可以添加新的数据,可以把它看成将两个具有相关内容的表联接在一起新生成的表,而一般的select 语句没有这个功能。
1) 内连接,inner join ... on
语句格式:
FROM (((表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号) INNER JOIN 表3 ON 表1.字段号=表3.字段号) INNER JOIN 表4 ON Member.字段号=表4.字段号) INNER JOIN 表X ON Member.字段号=表X.字段号
例子:
SELECT *
FROM (((Member INNER JOIN MemberSort ON Member.MemberSort=MemberSort.MemberSort) INNER JOIN MemberLevel ON Member.MemberLevel=MemberLevel.MemberLevel) INNER JOIN MemberIdentity ON Member.MemberIdentity=MemberIdentity.MemberIdentity) INNER JOIN Wedlock ON Member.Wedlock=Wedlock.Wedlock
ORDER BY MemberDate DESC
内连接的功能是,把两个表相关联的记录列出来,必须是相关联的记录。
2) 左外连接,left outer join ... on
语句格式:
FROM [表名1] LEFT JOIN [表名2]
ON [表名1.字段A] 〈关系运算符〉[表名2.字段B]
其实LEFT JOIN 的功能就是将LEFT左边的表名1中的所有记录全部保留,而将右边的表名2中的字段B与表名1.字段A相对应的记录显示出来(当使用SELECT * 时)。而RIGHT JOIN 和LEFT JOIN 相反。
外连接的功能是,把LEFT左边的表中的所有记录保留,而右边表只保留相关联的记录,也就是先执行一次INNER JOIN,然后把LEFT左边的表中的与右边表没有任何关联的记录也保留,而右边表的字段为null.
3) 右外连接,right outer join ... on
与 left join左右相反。
4) 全连接,full join ... on(不常使用,只能用于outer)
功能结合了以上三种联军,先执行一次inner join,然后把两个表的多余字段都保留,但连接的对应字段为null.
如果想将几个表联接起来,在JOIN操作中我们可以进行嵌套操作,有三个表:表1、表2、表3,现在将三个表联接起来:
FROM (表1 INNER JOIN 表2 ON 表1.序号=表2.序号)
INNER JOIN 表3 ON 表1.序号=表3.序号
我是做信息系统的
------------------------------华丽分割--------------------------------
觉得初级应该就是
一些简单的查询,插入,删除,更新数据啊什么的,
再提升一下就是 存储过程,触发器,动态SQL,子查询,自定义函数,游标等,我觉得这部分是建立在上面简单查询的,这部分技巧的东西比较多。
再提升一下就是把前面的综合运用,做出各种各样的统计报表,这部分,更加能考验SQL语句是否写的好,而且最重要的SQL语句还要方便维护与更新,这很能体现SQL运用情况。
初级还是必须多实践,而且做查询,有时间还需多想是否还有别的方式去替代,这样我觉得知识才能灵活运用,举一反三,触类旁通。
------------------------------华丽分割--------------------------------
中级 我觉得应该是(我是学SQLSERVER)
优化阶段,分析SQL性能,分析执行计划,了解存储引擎,
可能我比较笨,这部分我觉得还是比较有难度,这部分觉得也必须建立在初级上面,没有初级的大量实践,大脑也不会有大量的例子来了解SQL工作原理,这个地方有个很好的例子,简单来说为来保证服务器能长期运行,不负载导致崩溃,前台查询的时候,可以生成一个XML的Sqlserver执行计划(也就是CPU,IO等的开销啦),后台可以通过程序来判断是否计划超过指定的值,如果超过指定的值,将停止用户查询。
------------------------------华丽分割--------------------------------
高级 应该是手中无剑,心中有剑,人库合一了 哈哈,前不久CSDN有个人问了个问题,他问:为什么数据库的大师级人物怎么都是用数据库的,而不是做数据库的人,下面有个问答,我觉得不错。做数据库的是铁匠,用数据库的是剑客,
铁匠不一定会用剑。这就说明了,SQL必需要通过大量实践运用,才能深刻理解其中的原理,实践出真知。
写的有点啰嗦正好自己对自己的学习总结下。