1.如果执行多条SQL语句?我在一个Textbox中输入
N条SQL 有select insert update...等
如何一起执行?返回所影响的“行数” 事务就不需要了。。
2.多条查询语句。如何执行多条查询,把查询出的DataTable 放在dataset中?
然后在通过循环DataSet中的DataTable的count来
动态创建DataGridview
从而接收每个DataTale的数据?还有控制它的布局。
我打算把这些放在一个panel里.
今天看了一个朋友的写法 感觉不是很好。特来找简单的算法.
分不够在家 顶者有分.
N条SQL 有select insert update...等
如何一起执行?返回所影响的“行数” 事务就不需要了。。
2.多条查询语句。如何执行多条查询,把查询出的DataTable 放在dataset中?
然后在通过循环DataSet中的DataTable的count来
动态创建DataGridview
从而接收每个DataTale的数据?还有控制它的布局。
我打算把这些放在一个panel里.
今天看了一个朋友的写法 感觉不是很好。特来找简单的算法.
分不够在家 顶者有分.
using(TransactionScope scope = new TransactionScope())
{
//方法1
//方法2
scope.Complete();
}
还有LINQ TO DATASET等
循环执行 效率低了点
或者
对textbox的内容拆分成几个语句执行
就像方法一样。
直接调用
sqlhelper看看
第一个问题解决了 一起传到 SqlDataAdapter da = new SqlDataAdapter(cmd);里
不过感觉不是很妙。
呵呵 第二个有会的吗?
string sql="insert into temp values(...);select @@identity";SqlCommand cmd=new SqlCommand(sql,conn);
int result=Convert.ToInt32(cmd.ExecuteScaler());//ExecuteScaler好像写错了,不记得了
sql语句可以用;隔开,看最后一个;后的语句,如果是查询,那么就ExecuteScaler,插入就ExecuteNonQuery()感觉是可以的啊,
2。select * from boy union all select * from girl返回的是boy和girl表的全部字段
可以用DataTable来接
string strSql = "select * from t1;select * from t2;";
System.Data.SqlClient.SqlConnection conn=new System.Data.SqlClient.SqlConnection("Data Source =.;Initial Catalog = test;User ID = sa;PassWord = sa;Connect Timeout = 5;");
System.Data.SqlClient.SqlDataAdapter da = new System.Data.SqlClient.SqlDataAdapter(strSql, conn);
da.Fill(ds);
sql如上面的代码,ds中将包含两个DataTable
string strSql = "select * from t1;select * from t2;";
System.Data.SqlClient.SqlConnection conn=new System.Data.SqlClient.SqlConnection("Data Source =.;Initial Catalog = test;User ID = sa;PassWord = sa;Connect Timeout = 5;");
System.Data.SqlClient.SqlDataAdapter da = new System.Data.SqlClient.SqlDataAdapter(strSql, conn);
da.Fill(ds);
如何一起执行?返回所影响的“行数” 事务就不需要了。。
影响条数,照你10楼的写法,只能获得最后一句的影响条数。如果只是这样的话,直接按普通的SQL语句执行就完了。
第二个问题,多条查询语句。如何执行多条查询,把查询出的DataTable 放在dataset中?只能通过循环,单句执行了,不知道还有没有别的一次执行,把所有结果都放入DataSet的方法
动态加载DataGrid?
select * into #temp1 from PriceList where UploadDate>='"+dd+ @"'select a.* into #temp2 from #temp1 a inner join
(select MAX(UploadDate) maxDate, SupplierID from #temp1 group by SupplierID) b
on a.SupplierID=b.SupplierID and a.UploadDate=b.maxDate where a.SupplierID=100 or a.Quantity>10select a.[ItemID],a.[PRODUCT_TYPE],a.[UPC],a.[TITLE],a.[PLATFORM],a.[FORMAT], b.*,c.CompanyName from MyItems a inner join #temp2 b on a.UPC=b.UPC,Supplier c where b.SupplierID=c.CompanyID order by ItemID, b.Price
";
SqlConnection conn = new SqlConnection(connectionString);
conn.Open(); SqlCommand cmd = conn.CreateCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = sql;
cmd.CommandTimeout = 0;
SqlDataReader reader = cmd.ExecuteReader();
要得到ds里的Table,可以遍历ds.Tables
然后for
DataGrid dg=new DataGrid ()
dg.name="asd"+i
......
control.add..
就是这个意思但是我不会控制他的位置..
string strSql = "select * from t1;select * from t2;";
System.Data.SqlClient.SqlConnection conn=new System.Data.SqlClient.SqlConnection("Data Source =.;Initial Catalog = test;User ID = sa;PassWord = sa;Connect Timeout = 5;");
System.Data.SqlClient.SqlDataAdapter da = new System.Data.SqlClient.SqlDataAdapter(strSql, conn);
da.Fill(ds);
using System.Collections;
using System.Collections.Generic;
using System.Threading;/// <summary>
/// 在开发中经常会遇到线程的例子,如果某个后台操作比较费时间,我们就可以启动一个线程去执行那个费时的操作,同时程序继续执行。在某些情况下可能会出现多个线程的同步协同的问题,下面的例子就展示了在两个线程之间如何协同工作。
///
///这个程序的思路是共同做一件事情(从一个ArrayList中删除元素),如果执行完成了,两个线程都停止执行。public class ThreadDemo
{
private Thread threadOne;
private Thread threadTwo;
private ArrayList stringList;
private event EventHandler OnNumberClear;//数据删除完成引发的事件
public static void Main()
{
ThreadDemo demo = new ThreadDemo(1000);
demo.Action();
}
public ThreadDemo(int number)
{
Random random = new Random(1000000);
stringList = new ArrayList(number);
for (int i = 0; i < number; i++)
{
stringList.Add(random.Next().ToString());
}
threadOne = new Thread(new ThreadStart(Run));//两个线程共同做一件事情
threadTwo = new Thread(new ThreadStart(Run));//两个线程共同做一件事情
threadOne.Name = "线程1";
threadTwo.Name = "线程2";
OnNumberClear += new EventHandler(ThreadDemo_OnNumberClear);
}
/// <summary>
/// 开始工作
/// </summary>
public void Action()
{
threadOne.Start();
threadTwo.Start();
}
/// <summary>
/// 共同做的工作
/// </summary>
private void Run()
{
string stringValue = null;
while (true)
{
Monitor.Enter(this);//锁定,保持同步
stringValue = (string)stringList[0];
Console.WriteLine(Thread.CurrentThread.Name + "删除了" + stringValue);
stringList.RemoveAt(0);//删除ArrayList中的元素
if (stringList.Count == 0)
{
OnNumberClear(this, new EventArgs());//引发完成事件
}
Monitor.Exit(this);//取消锁定
Thread.Sleep(5);
}
} //执行完成之后,停止所有线程
void ThreadDemo_OnNumberClear(object sender, EventArgs e)
{
Console.WriteLine("执行完了,停止了所有线程的执行。");
threadTwo.Abort();
threadOne.Abort();
}
}
/// <summary>
/// 执行多条SQL语句,实现数据库事务。
/// </summary>
/// <param name="SQLStringList">多条SQL语句</param>
public static int ExecuteSqlTran(List<String> SQLStringList)
{
using (MySqlConnection conn = new MySqlConnection(connectionString))
{
conn.Open();
MySqlCommand cmd = new MySqlCommand();
cmd.Connection = conn;
MySqlTransaction tx = conn.BeginTransaction();
cmd.Transaction = tx;
try
{
int count = 0;
for (int n = 0; n < SQLStringList.Count; n++)
{
string strsql = SQLStringList[n];
if (strsql.Trim().Length > 1)
{
cmd.CommandText = strsql;
count += cmd.ExecuteNonQuery();
}
}
tx.Commit();
return count;
}
catch
{
tx.Rollback();
return 0;
}
}
}
可以这样啊! for (int i=0;i< ds.Tables.Count;i++)
{
DataGrid dg = new DataGrid();
dg.DataSource = ds.Tables[i];
dg.Width = 300;
dg.Height = 200;
dg.Location = new Point(0, dg.Height * i);
pnlBody.Controls.Add(dg);
}
N条SQL 有select insert update...等
如何一起执行?返回所影响的“行数” 事务就不需要了。。
2.多条查询语句。如何执行多条查询,把查询出的DataTable 放在dataset中?
然后在通过循环DataSet中的DataTable的count来
动态创建DataGridview
从而接收每个DataTale的数据?还有控制它的布局。
我打算把这些放在一个panel里.
回答一 你在TEXTBOX中输入多条语句.只要中间加上';'号便可以..可以做一次执行也可以在程序中用';'把他们分开,分次执行..回答二..关与你说的第二个问题..与第一个问题在SQL语句执行上应该没有什么大的出入,无非就是想得到结果..
你可以分开执行查询语句,返回datatable 然后加入Dataset 做数据展示时把for (int i=0;i< ds.Tables.Count;i++)
{
DataGrid dg = new DataGrid();
dg.DataSource = ds.Tables[i];
dg.Width = 300;
dg.Height = 200;
dg.Location = new Point(0, dg.Height * i);
pnlBody.Controls.Add(dg);
}套在你的DataSEt循环中即可
2.如果是有关联的表查询,建议LZ使用视图来实现,如果没有关联的,建议LZ用存储过程来实现,并用DataSet存储,DataTabel是单内存表存储数据的,而DataSet是表示多个内存表的集合即数据集。
把textbox的内容拆分成几个语句,再把一部分SQL语句当作一个字符串一起放到存储过程中执行
或者
合查询。UNION的语法格式为:[code]select_statement
UNION [ALL] selectstatement
[UNION [ALL] selectstatement][…n][/code]其中selectstatement为待联合的SELECT查询语句。
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一
行。
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类
型,系统将低精度的数据类型转换为高精度的数据类型。
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如:
查询1 UNION (查询2 UNION 查询3)三、连接查询
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型
数据库管理系统的一个标志。
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行
查询。
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。
SQL-92标准所定义的FROM子句的连接语法格式为:
[code]FROM join_table join_type join_table [ON (join_condition)][/code]
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一
个表操作的连接又称做自连接。
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN)
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的
数据行。
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑
运算符等构成。
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接
连接。例如:[code]SELECT p1.pub_id,p2.pub_id,p1.pr_info
FROM pub_info AS p1 INNER JOIN pub_info AS p2
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info)[/code](一)内连接
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分
三种:
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接
表中的所有列,包括其中的重复列。
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些
运算符包括>、>=、<=、<、!>、!<和<>。
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询
结果集合中所包括的列,并删除连接表中的重复列。
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社:[code]SELECT *
FROM authors AS a INNER JOIN publishers AS p
ON a.city=p.city[/code]又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state):[code]SELECT a.*,p.pub_id,p.pub_name,p.country
FROM authors AS a INNER JOIN publishers AS p
ON a.city=p.city[/code](二)外连接
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。
如下面使用左外连接将论坛内容和作者信息连接起来:
[code]SELECT a.*,b.* FROM `luntan` LEFT JOIN usertable as b
ON a.username=b.username[/code]
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市:
[code]
SELECT a.*,b.*
FROM city as a FULL OUTER JOIN user as b
ON a.username=b.username[/code](三)交叉连接
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等
于6*8=48行。
[code]SELECT `type`,`pub_name`
FROM `titles` CROSS JOIN `publishers`
ORDER BY `type`[/code]SQL核心语句(非常实用的几个技巧)_ArticleContent1_lblContent>插入数据向表中添加一个新记录,你要使用SQL INSERT 语句。这里有一个如何使用这种语句的例子:[code]INSERT mytable (mycolumn) VALUES (‘some data’) [/code]这个语句把字符串’some data’插入表mytable的mycolumn字段中。将要被插入数据的字段的名字在第一个括号中指定,实际的数据在第二个括号中给出。INSERT 语句的完整句法如下:[code]INSERT [INTO] {table_name|view_name} [(column_list)] {DEFAULT VALUES |Values_list | select_statement} [/code]如果一个表有多个字段,通过把字段名和字段值用逗号隔开,你可以向所有的字段中插入数据。假设表mytable有三个字段 first_column,second_column,和third_column。下面的INSERT语句添加了一条三个字段都有值的完整记录: [code]INSERT mytable (first_column,second_column,third_column)VALUES (‘some data’,’some more data’,’yet more data’) [/code]注意
请参考Microsoft SQL Sever 的文档
SQL05版的查询分析器 N条语句执行 返回不同的结果。
您看呢?