Windows Phone 7手机开发、
.Net培训
private void button1_Click(object sender, RoutedEventArgs e)
{
using (SqlConnection conn = new
SqlConnection("Data Source=.;Initial
Catalog=mydb2;User ID=sa;Password=123456"))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "select * from T_employee where FAge<100";
using (SqlDataReader reader = cmd.ExecuteReader())//查询结果只放到数据库中,而不占用客户端。查询完成之后,有一个相当于指针的指针放到最开始之前的一格,每调用reader一次指针下一条,当移到最后一条之后时,就返回true。
{
while(reader.Read())
{
string name=reader.GetString(1);//1是指的在查询结果中的第1列
MessageBox.Show(name);
}
}
}
MessageBox.Show("execute accomplish");
}
}
02参数化查询以便防止SQL注入漏洞攻击
using (SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=mydb2;User ID=sa;Password=123456"))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
//cmd.CommandText = "select FAge from T_employee where FName='"+txtName.Text+"'";//这种方式输入1'or'1'='1会造成SQL注入漏洞。
cmd.CommandText = "select FAge from T_employee where FName=@Name or FAge>@age";//@Name是占位符,表示待会要往这里填
//cmd.Parameters.AddWithValue("@Name", txtName.Text);//可以,但是推荐下面的方法
cmd.Parameters.Add(new SqlParameter("@Name", txtName.Text));//给@Name的值设置为文本框的值。
cmd.Parameters.Add(new SqlParameter("@age", txtAge.Text));
//只能用在刚才、inset into……value(@name.@Age)或者delect……where id=@ID,总之@参数不能用来替换表名、字段名、select之类的关键字。
using (SqlDataReader reader = cmd.ExecuteReader())
{
while(reader.Read())
{
int age=reader.GetInt32(0);
MessageBox.Show(age.ToString());
}
}
}
MessageBox.Show("execute accomplish");
}
03DataSet离线数据集
SQLDataReader是连接相关的,SqlDataReader中的查询结果并不是放到程序中的,而是放在数据库服务器中,SqlDataReader只是相当于放了一个指针(游标),只能读取当前游标指向的行,一旦连接断开就不能再读取。这样做大的好处是无论查询结果有多少条,对程序占用的内存都几乎没有影响。但是如果数据量如果不是很大,就可以将数据拿到客户端。DataSet离线数据集可以减小数据区的压力。
private void button2_Click(object sender, RoutedEventArgs e)
{
using (SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=mydb2;User ID=sa;Password=123456"))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "select * from T_employee where FAge<@age";
cmd.Parameters.Add(new SqlParameter("@age", 30));
SqlDataAdapter adaper = new SqlDataAdapter(cmd);//SqlDataAdapter是帮我们把SqlCommand查询结果填充到DataSet中的类
DataSet dataset = new DataSet();//相当于本地的一个负载集合(List<int>)
adaper.Fill(dataset);//Fill把查询结果填充到DataSet中
DataTable table = dataset.Tables[0];
DataRowCollection rows = table.Rows;
for (int i = 0; i < rows.Count; i++)
{
DataRow row = rows[i];
int age = (int)row["FAge"];
string name = (string)row["FName"];
MessageBox.Show(name + "," + age);
}
}
}
}
04连接字符串放到配置文件中
1将连接字符串添加到应用程序配置文件。添加》新建项》应用程序配置文件(默认文件名值App1.config,但是这样运行的时候会报错“连接字符串未将对象引用设置到对象的实例”,要把名字改成App.config切放到最上层)》添加节点
<configuration>
<connectionStrings>
<add name="dbConnStr"
connectionString="Data Source=.;Initial Catalog=mydb2;User ID=sa;Password=12346"/>
</connectionStrings>
</configuration>
2添加引用
给用户的时候要给a.exe和相应的a.exe.config。连接变了之后改config文件就行了。asp.net里是web.config
05自己编写Sqlhelper以及改进
class SqlHelper
{ private static string connStr = ConfigurationManager.ConnectionStrings["dbConnStr"].ConnectionString;//static程序初始化时运行。
只用来查询执行结果比较小的sql
//public static DataSet ExecuteDataSet(string sql)
//{
// using (SqlConnection conn = new SqlConnection(connStr))
// {
// conn.Open();
// using (SqlCommand cmd = conn.CreateCommand())
// {
// cmd.CommandText = sql;
// SqlDataAdapter adapter = new SqlDataAdapter(cmd);
// DataSet dataset = new DataSet();
// adapter.Fill(dataset);
// return dataset;
// }
// }
//}
public static DataSet ExecuteDataSet(string sql,SqlParameter[] parameters)
{
using (SqlConnection conn = new SqlConnection(connStr))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = sql;
cmd.Parameters.AddRange(parameters);
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataSet dataset = new DataSet();
adapter.Fill(dataset);
return dataset;
}
}
}
}
使用时:
private void btSql_Click(object sender, RoutedEventArgs e)
{
//SqlHelper.ExecuteNonQuery("insert into T_employee(Name,Age) values('lily',26)");
DataSet ds=SqlHelper.ExecuteDataSet("select * from T_employee where Age>@age ",new SqlParameter[]{new SqlParameter("@age",26)});
foreach (DataRow row in ds.Tables[0].Rows)
{
string name = (string)row["Name"];
MessageBox.Show(name);
}
}
06长度可变参数
class Program
{
static void Main(string[] args)
{
int i = Sum(new int[] { 3, 5, 4, 2, 7 });
Console.WriteLine(i);
int j = Sum(3, 5, 74, 65, 3);
Console.WriteLine(j);
Console.ReadKey();
}
static int Sum(params int[] sums)//params把最后的所有参数拼到一个数组里。所有必须放到所有参数的最后一个。
{
int result = 0;
foreach (int i in sums)
{
result += i;
}
return result;
}
}
更改后的ExecuteDataTable:
public static DataTable ExecuteDataTable(string sql,params SqlParameter[] parameters)
{
using (SqlConnection conn = new SqlConnection(connStr))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = sql;
cmd.Parameters.AddRange(parameters);
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataSet dataset = new DataSet();
adapter.Fill(dataset);
return dataset.Tables[0];
}
}
}
使用:
private void btSql_Click(object sender, RoutedEventArgs e)
{
//SqlHelper.ExecuteNonQuery("insert into T_employee(Name,Age) values('lily',26)");
//DataTable table=SqlHelper.ExecuteDataTable("select * from T_employee where Age>@age ",new SqlParameter[]{new SqlParameter("@age",26)});
DataTable table=SqlHelper.ExecuteDataTable("select * from T_employee where Age>@age or Name=@name",new SqlParameter("@age",30),new SqlParameter("@name","lily"));
foreach (DataRow row in table.Rows)
{
string name = (string)row["Name"];
MessageBox.Show(name);
}
MessageBox.Show("accomplesh");
}
01执行多条查询结果ExecuteReader()
private void button1_Click(object sender, RoutedEventArgs e)
{
using (SqlConnection conn = new
SqlConnection("Data Source=.;Initial
Catalog=mydb2;User ID=sa;Password=123456"))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "select * from T_employee where FAge<100";
using (SqlDataReader reader = cmd.ExecuteReader())//查询结果只放到数据库中,而不占用客户端。查询完成之后,有一个相当于指针的指针放到最开始之前的一格,每调用reader一次指针下一条,当移到最后一条之后时,就返回true。
{
while(reader.Read())
{
string name=reader.GetString(1);//1是指的在查询结果中的第1列
MessageBox.Show(name);
}
}
}
MessageBox.Show("execute accomplish");
}
}
02参数化查询以便防止SQL注入漏洞攻击
using (SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=mydb2;User ID=sa;Password=123456"))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
//cmd.CommandText = "select FAge from T_employee where FName='"+txtName.Text+"'";//这种方式输入1'or'1'='1会造成SQL注入漏洞。
cmd.CommandText = "select FAge from T_employee where FName=@Name or FAge>@age";//@Name是占位符,表示待会要往这里填
//cmd.Parameters.AddWithValue("@Name", txtName.Text);//可以,但是推荐下面的方法
cmd.Parameters.Add(new SqlParameter("@Name", txtName.Text));//给@Name的值设置为文本框的值。
cmd.Parameters.Add(new SqlParameter("@age", txtAge.Text));
//只能用在刚才、inset into……value(@name.@Age)或者delect……where id=@ID,总之@参数不能用来替换表名、字段名、select之类的关键字。
using (SqlDataReader reader = cmd.ExecuteReader())
{
while(reader.Read())
{
int age=reader.GetInt32(0);
MessageBox.Show(age.ToString());
}
}
}
MessageBox.Show("execute accomplish");
}
03DataSet离线数据集
SQLDataReader是连接相关的,SqlDataReader中的查询结果并不是放到程序中的,而是放在数据库服务器中,SqlDataReader只是相当于放了一个指针(游标),只能读取当前游标指向的行,一旦连接断开就不能再读取。这样做大的好处是无论查询结果有多少条,对程序占用的内存都几乎没有影响。但是如果数据量如果不是很大,就可以将数据拿到客户端。DataSet离线数据集可以减小数据区的压力。
private void button2_Click(object sender, RoutedEventArgs e)
{
using (SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=mydb2;User ID=sa;Password=123456"))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "select * from T_employee where FAge<@age";
cmd.Parameters.Add(new SqlParameter("@age", 30));
SqlDataAdapter adaper = new SqlDataAdapter(cmd);//SqlDataAdapter是帮我们把SqlCommand查询结果填充到DataSet中的类
DataSet dataset = new DataSet();//相当于本地的一个负载集合(List<int>)
adaper.Fill(dataset);//Fill把查询结果填充到DataSet中
DataTable table = dataset.Tables[0];
DataRowCollection rows = table.Rows;
for (int i = 0; i < rows.Count; i++)
{
DataRow row = rows[i];
int age = (int)row["FAge"];
string name = (string)row["FName"];
MessageBox.Show(name + "," + age);
}
}
}
}
04连接字符串放到配置文件中
1将连接字符串添加到应用程序配置文件。添加》新建项》应用程序配置文件(默认文件名值App1.config,但是这样运行的时候会报错“连接字符串未将对象引用设置到对象的实例”,要把名字改成App.config切放到最上层)》添加节点
<configuration>
<connectionStrings>
<add name="dbConnStr"
connectionString="Data Source=.;Initial Catalog=mydb2;User ID=sa;Password=12346"/>
</connectionStrings>
</configuration>
2添加引用
解决方案管理器-引用》添加》.net》System.configuration
3编写语句
string cinnStr = ConfigurationManager.ConnectionStrings["dbConnStr"].ConnectionString;给用户的时候要给a.exe和相应的a.exe.config。连接变了之后改config文件就行了。asp.net里是web.config
05自己编写Sqlhelper以及改进
class SqlHelper
{ private static string connStr = ConfigurationManager.ConnectionStrings["dbConnStr"].ConnectionString;//static程序初始化时运行。
只用来查询执行结果比较小的sql
//public static DataSet ExecuteDataSet(string sql)
//{
// using (SqlConnection conn = new SqlConnection(connStr))
// {
// conn.Open();
// using (SqlCommand cmd = conn.CreateCommand())
// {
// cmd.CommandText = sql;
// SqlDataAdapter adapter = new SqlDataAdapter(cmd);
// DataSet dataset = new DataSet();
// adapter.Fill(dataset);
// return dataset;
// }
// }
//}
public static DataSet ExecuteDataSet(string sql,SqlParameter[] parameters)
{
using (SqlConnection conn = new SqlConnection(connStr))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = sql;
cmd.Parameters.AddRange(parameters);
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataSet dataset = new DataSet();
adapter.Fill(dataset);
return dataset;
}
}
}
}
使用时:
private void btSql_Click(object sender, RoutedEventArgs e)
{
//SqlHelper.ExecuteNonQuery("insert into T_employee(Name,Age) values('lily',26)");
DataSet ds=SqlHelper.ExecuteDataSet("select * from T_employee where Age>@age ",new SqlParameter[]{new SqlParameter("@age",26)});
foreach (DataRow row in ds.Tables[0].Rows)
{
string name = (string)row["Name"];
MessageBox.Show(name);
}
}
06长度可变参数
class Program
{
static void Main(string[] args)
{
int i = Sum(new int[] { 3, 5, 4, 2, 7 });
Console.WriteLine(i);
int j = Sum(3, 5, 74, 65, 3);
Console.WriteLine(j);
Console.ReadKey();
}
static int Sum(params int[] sums)//params把最后的所有参数拼到一个数组里。所有必须放到所有参数的最后一个。
{
int result = 0;
foreach (int i in sums)
{
result += i;
}
return result;
}
}
更改后的ExecuteDataTable:
public static DataTable ExecuteDataTable(string sql,params SqlParameter[] parameters)
{
using (SqlConnection conn = new SqlConnection(connStr))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = sql;
cmd.Parameters.AddRange(parameters);
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataSet dataset = new DataSet();
adapter.Fill(dataset);
return dataset.Tables[0];
}
}
}
使用:
private void btSql_Click(object sender, RoutedEventArgs e)
{
//SqlHelper.ExecuteNonQuery("insert into T_employee(Name,Age) values('lily',26)");
//DataTable table=SqlHelper.ExecuteDataTable("select * from T_employee where Age>@age ",new SqlParameter[]{new SqlParameter("@age",26)});
DataTable table=SqlHelper.ExecuteDataTable("select * from T_employee where Age>@age or Name=@name",new SqlParameter("@age",30),new SqlParameter("@name","lily"));
foreach (DataRow row in table.Rows)
{
string name = (string)row["Name"];
MessageBox.Show(name);
}
MessageBox.Show("accomplesh");
}