
用到的函数都比较容易理解,我就没多加说明了,如果有不理解的复制函数名百度一下,会有详细的说明的。大概的流程就是这样了~
//包含头文件
#include "windows.h"
#include "sqlext.h"
#pragma comment(lib,"odbc32.lib")
int main(int argc, char* argv[]){
//1.连接数据源(前提是你已经配置好了数据源,我用的sqlserver数据库,怎么配数据源百度一下~很简单的)
//分配环境句柄, 保存一些驱动程序的信息
SQLHENV henv//环境句柄
SQLRETURN sqlRet
sqlRet = SQLAllocEnv(&henv)
if (sqlRet != SQL_SUCCESS &&sqlRet != SQL_SUCCESS_WITH_INFO)
{
printf("分配环境句柄失败!\n")
return -1
}
//分配连接句柄
SQLHDBC hdbc//连接句柄
sqlRet = SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc)
if (sqlRet != SQL_SUCCESS &&sqlRet != SQL_SUCCESS_WITH_INFO)
{
printf("分配连接句柄失败!\n")
return -1
}
//连接数据源(test是数据库名字,sa 和sa 是用户们和密码,你替换即可)
sqlRet = SQLConnect(hdbc,(SQLCHAR*)"test",strlen("test"),(SQLCHAR*)"sa",2,(SQLCHAR*)"sa",2)
if (sqlRet != SQL_SUCCESS &&sqlRet != SQL_SUCCESS_WITH_INFO)
{
printf("连接数据源失败!\n")
return -1
}
//2.执行SQL语句
//准备语句句柄
SQLHSTMT hstmt
sqlRet = SQLAllocHandle(SQL_HANDLE_STMT,hdbc,&hstmt)
if (sqlRet != SQL_SUCCESS &&sqlRet != SQL_SUCCESS_WITH_INFO)
{
printf("连接语句句柄失败!\n")
return -1
}
//设置游标类型(参看:http://blog.csdn.net/bichenggui/article/details/5601381)
sqlRet = SQLSetStmtOption(hstmt,SQL_ATTR_CURSOR_TYPE,SQL_CURSOR_KEYSET_DRIVEN)
if (sqlRet != SQL_SUCCESS &&sqlRet != SQL_SUCCESS_WITH_INFO)
{
printf("设置光标类型失败!\n")
return -1
}
//执行SQL语句
//直接执行(你替换成你自己的sqlserver语句即可)
sqlRet = SQLExecDirect(hstmt,(SQLCHAR*)"insert into student values('lsk',21)",SQL_NTS)
if (sqlRet != SQL_SUCCESS &&sqlRet != SQL_SUCCESS_WITH_INFO)
{
printf("执行SQL语句失败!\n")
return -1
}
//获取结果集
SQLCHAR value[20]={0}
SQLINTEGER len = 0
//移动光标(不移动前光标指向结果集第一列的前面)
SQLFetch(hstmt)
//取值(取的是结果集的第一列的值),第二个参数表示取第几列
SQLGetData(hstmt,1,SQL_C_CHAR,value,20,&len)
printf("结果为:%s\n",value)
//假如结果集有多行则再次移动光标即可
SQLFetch(hstmt)
//然后再次取值
SQLGetData(hstmt,1,SQL_C_CHAR,value,20,&len)
//关闭句柄,释放资源
SQLFreeHandle(SQL_HANDLE_STMT, hstmt) //释放语句句柄
SQLDisconnect(hdbc) //断开连接
SQLFreeHandle(SQL_HANDLE_DBC, hdbc) //释放连接句柄
SQLFreeHandle(SQL_HANDLE_ENV, henv) //释放环境句柄
return 0
}
给你一个稍微复杂一点的查询,我设计的
看上图我把第一列标签后面的控件命名有规律,比如计划工厂后面文本框是"计划工厂t",Exapt命名为"计划工厂c",后面还隐藏一个listbox,命名为"计划工厂l"。
计划工厂 这个名称本身就是我要查询的表里面包含的字段。
利用这种界面,我要完成一些复杂点的查询:点文本框里的小图标按钮,d出工具,可以输入多条件,条件可以成立为模糊条件(用*代替不认识部分),也可以成立为否决条件。
选中Exapt全部否定所成立条件;点击执行按钮,有条件的成立条件,无条件的不成立。
所以这种东西贯穿软件我就不能每个都去做,就只能写一个类文件:
public class conditionset{
public void load_condit(Panel p)
{
foreach (Control ctl in p.Controls)
{
if (ctl is SkinTextBox)
{
SkinTextBox sktxt = (SkinTextBox)p.Controls[ctl.Name]
ListBox list = (ListBox)p.Controls[sktxt.Name.Substring(0, sktxt.Name.Length - 1) + "l"]
sktxt.IconClick += (Object sen, EventArgs ed) =>
{
ctl.condition toolform = new ctl.condition()
if (list.Items.Count > 0)
{
sktxt.Text = "┅"
sktxt.ReadOnly = true
}
foreach (var sm in list.Items)
{
toolform.dv.Rows.Add(sm.ToString())
}
toolform.Show()
toolform.cleari += (Object send, EventArgs er) =>
{
sktxt.Text = ""
sktxt.ReadOnly = false
}
toolform.subm += (Object send, EventArgs er) =>
{
list.Items.Clear()
foreach (DataGridViewRow dvr in toolform.dv.Rows)
{
if (Convert.ToString(dvr.Cells[0].Value) != "")
{
list.Items.Add(Convert.ToString(dvr.Cells[0].Value))
}
}
sktxt.Text = "┅"
sktxt.ReadOnly = true
}
}
}
}
}
public string condit(Panel p)
{
string master_condition = ""
foreach (Control ctl in p.Controls)
{
//遍历panel查找条件
#region
string condition = ""
if (ctl is SkinTextBox)
{
//文本框条件组合
#region
SkinTextBox sktxt = (SkinTextBox)p.Controls[ctl.Name]
string ziduan_name = sktxt.Name.Substring(0, sktxt.Name.Length - 1)
SkinCheckBox skck = (SkinCheckBox)p.Controls[ctl.Name.Substring(0, ctl.Name.Length - 1) + "c"]
ListBox list = (ListBox)p.Controls[ctl.Name.Substring(0, ctl.Name.Length - 1) + "l"]
if (sktxt.Text != "")
{
if (sktxt.Text == "┅")
{
string blur_str = "", blur = ""
foreach (var itm in list.Items)
{
if (itm.ToString().Contains("*"))
{
if (skck.Checked == true)
{
blur += " and " + ziduan_name + " not like '" + itm.ToString().Replace("*", "%") + "'"
}
else
{
blur += " or " + ziduan_name + " like '" + itm.ToString().Replace("*", "%") + "'"
}
}
else
{
blur_str += "'" + Convert.ToString(itm) + "',"
}
}
string blur_sql = (blur == "") ? "" : blur.Substring(4, blur.Length - 4).Trim()
string in_condition = "", like_condition = ""
if (skck.Checked == true)
{
in_condition = ziduan_name + " not in "
like_condition = " and "
}
else
{
in_condition = ziduan_name + " in "
like_condition = " or "
}
string contains_sql = (blur_str == "") ? "" : in_condition + "(" + blur_str.Substring(0, blur_str.Length - 1) + ")"
condition = contains_sql + blur_sql
if (blur_sql != "" && contains_sql != "")
{
condition = contains_sql + like_condition + blur_sql
}
else
{
condition = contains_sql + blur_sql
}
}
else
{
if (!sktxt.Text.Contains("*"))
{
if (skck.Checked == true)
{
condition = ziduan_name + "<>'" + sktxt.Text + "'"
}
else
{
condition = ziduan_name + "='" + sktxt.Text + "'"
}
}
else
{
if (skck.Checked == true)
{
condition = ziduan_name + " not like '" + sktxt.Text.Replace("*", "%") + "'"
}
else
{
condition = ziduan_name + " like '" + sktxt.Text.Replace("*", "%") + "'"
}
}
}
}
#endregion
}
if (ctl is SkinDateTimePicker)
{
//日期条件组合
#region
if (ctl.Name.Substring(ctl.Name.Length - 1, 1) != "t")
{
SkinDateTimePicker skdate_sta = (SkinDateTimePicker)p.Controls[ctl.Name]
SkinDateTimePicker skdate_end = (SkinDateTimePicker)p.Controls[ctl.Name + "t"]
if (skdate_sta.text != "")
{
if (skdate_end.text == "")
{
condition = skdate_sta.Name + "='" + skdate_sta.text + "'"
}
else
{
condition = skdate_sta.Name + ">='" + skdate_sta.text + "' and " + skdate_sta.Name + "<='" + skdate_end.text + "'"
}
}
}
#endregion
}
master_condition += (condition == "") ? "" : "(" + condition + ") and "
#endregion //遍历panel查找条件
}
string condition_sql = (master_condition == "") ? "" : master_condition.Substring(0, master_condition.Length - 5)
return condition_sql
}
}
工具用一个窗体代替:
public partial class condition : Form{
public condition()
{
InitializeComponent()
}
public event EventHandler subm
public event EventHandler cleari
private void submit_Click(object sender, EventArgs e)
{
subm(sender, e)
this.Dispose()
}
private void clearit_Click(object sender, EventArgs e)
{
this.Dispose()
dv.Rows.Clear()
cleari(sender, e)
}
}
当我们执行多条件的时候就等于拼接条件
如何查询oracle数据库一个表中的很多条记录是否有重复?重复的判断标准是指定为几个字段中只要有任意的一个字段中有重复就将重复的记录列出来。Select * From Table1 a
Where Exists (
Select * from Table1
where id=a.id
Group By ID
Having Count(*) > 1 //查出两条以上的记录
)
or:
Select * From Table1
Where id in (
Select id from Table1
Group By ID
Having Count(*) > 1 //查出两条以上的记录
)
or:
Select * From yourtable A
Where (Select count(*) From yourtable Where Field1=A.Field1)>1
or (Select count(*) From yourtable Where Field2=A.Field2)>1
or (Select count(*) From yourtable Where Field3=A.Field3)>1 ...
Order By A.Field1,Field2,Field3 ...
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)