sql自治
① sql替換欄位
獲得城市
CREATE function getCity
(@city varchar(60)
) returns varchar(60) as
begin
return isnull((select top 1 city from dbo.city where city like rtrim(@city)+'%'),'')
end
獲得省份
CREATE function getProvince
(@province varchar(60)
) returns varchar(60) as
begin
return isnull((select top 1 province from dbo.province where province like rtrim(@province)+'%'),'')
end
獲得地址,聯合的
CREATE FUNCTION getAllAddress
(
@address varchar(100)
)
RETURNS nvarchar(100) AS
BEGIN
declare @vpro nvarchar(50)
declare @vcity nvarchar(50)
declare @result nvarchar(100)
set @vpro = isnull((select top 1 province from province where ltrim(rtrim(@address)) like replace(replace(replace(replace(REPLACE(REPLACE(REPLACE(province,'省',''),'特區',''),'自治區',''),'壯族自治區',''),'藏族自治區',''),'維吾爾',''),'市','')+'%'),'')
set @vcity = isnull((select top 1 city from city where ltrim(rtrim(@address)) like '%'+REPLACE(REPLACE(REPLACE(city,'市',''),'區',''),'縣','')),'')
if @vpro != ''
set @result = @vpro
if @vcity != ''
set @result = @result + '>>'+@vcity
return isnull(ltrim(rtrim(@result)),'')
END
更新語句
省市
update job_personcomm
set n_place_p = dbo.getProvince(n_place_p),
liveplace_p = dbo.getProvince(liveplace_p),
n_place_c = dbo.getCity(n_place_c),
liveplace_c = dbo.getCity(liveplace_c)
地址
update job_personintent set s_pwl1 = ltrim(rtrim(dbo.getAllAddress(s_pwl1))),
s_pwl2 = ltrim(rtrim(dbo.getAllAddress(s_pwl2))),
s_pwl3 = ltrim(rtrim(dbo.getAllAddress(s_pwl3)))
題目是我出的,也是我自己答了,謝謝各位費心思了,分會給的
② mysql事務可以做什麼
MySQL 事務主要用於處理操作量大,復雜度高的數據。比如說,在人員管理系統中,你刪除一個人員,你即需要刪除人員的基本資料,也要刪除和該人員相關的信息,如信箱,文章等等,這樣,這些資料庫操作語句就構成一個事務!
在 MySQL 中只有使用了 Innodb 資料庫引擎的資料庫或表才支持事務。
事務處理可以用來維護資料庫的完整性,保證成批的 SQL 語句要麼全部執行,要麼全部不執行。
事務用來管理 insert,update,delete 語句
一般來說,事務是必須滿足4個條件(ACID)::原子性(Atomicity,或稱不可分割性)、一致性(Consistency)、隔離性(Isolation,又稱獨立性)、持久性(Durability)。
③ Mysql資料庫中,事務是指什麼如何使用該功能
MySQL 事務
什麼是事務?
MySQL 事務主要用於處理操作量大,復雜度高的數據。比如說,在人員管理系統中,你刪除一個人員,你既需要刪除人員的基本資料,也要刪除和該人員相關的信息,如信箱,文章等等,這樣,這些資料庫操作語句就構成一個事務!
在 MySQL 中只有使用了 Innodb 資料庫引擎的資料庫或表才支持事務。
事務處理可以用來維護資料庫的完整性,保證成批的 SQL 語句要麼全部執行,要麼全部不執行。
事務用來管理 insert,update,delete 語句
一般來說,事務是必須滿足4個條件(ACID):原子性(Atomicity,或稱不可分割性)、一致性(Consistency)、隔離性(Isolation,又稱獨立性)、持久性(Durability)。
原子性:一個事務(transaction)中的所有操作,要麼全部完成,要麼全部不完成,不會結束在中間某個環節。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。
一致性:在事務開始之前和事務結束以後,資料庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預設規則,這包含資料的精確度、串聯性以及後續資料庫可以自發性地完成預定的工作。
隔離性:資料庫允許多個並發事務同時對其數據進行讀寫和修改的能力,隔離性可以防止多個事務並發執行時由於交叉執行而導致數據的不一致。事務隔離分為不同級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重復讀(repeatable read)和串列化(Serializable)。
持久性:事務處理結束後,對數據的修改就是永久的,即便系統故障也不會丟失。
在 MySQL 命令行的默認設置下,事務都是自動提交的,即執行 SQL 語句後就會馬上執行 COMMIT 操作。因此要顯式地開啟一個事務務須使用命令 BEGIN 或 START TRANSACTION,或者執行命令 SET AUTOCOMMIT=0,用來禁止使用當前會話的自動提交。
from 樹懶學堂 - 一站式數據知識平台
④ SQL Server 怎樣在自定義函數裡面調用存儲過程
oracle在函數里可以添加關鍵字PRAGMA AUTONOMOUS_TRANSACTION 來讓其支持自治事務,sqlserevr沒用過不知道支不支持,樓主可以網路一下自治事務的用法,單從需求上來說,為什麼一定要用函數,不可以寫一個自定義的存儲過程嗎?
⑤ oracle plsql什麼時候使用自治事務
了解oracle自治事務
1、什麼是Oracle自治事務
在官方文檔中,是這樣的定義的「Autonomous transactions are independent transactions that can be called from within another transaction.」就是說它被一個事務調用的事務,但它獨立於它的父事務提交或回滾。
下面看一個例子
首先創建一張測試表
www.2cto.com
[sql]
MIKE@ORA11G> create table test(m varchar2(30));Table created.
創建兩個procere,一個是自治事務的,一個是非自治事務的[sql]
create or replace procere auto_proce
as
pragma autonomous_transaction;
begin
insert into test values('autonomous!');
commit;
end;
/
[sql]
create or replace procere nonauto_proceas www.2cto.com
begin
insert into test values('nonautonomous!');commit;
end;
/
先調用nonauto_proce,看一下會發生什麼?
[sql]
SQL> select * from test;
未選定行
SQL> begin
2 insert into test values('test');
3 nonauto_proce;
4 rollback;
5 end;
6 /
PL/SQL 過程已成功完成。
SQL> select * from test;
www.2cto.com
M
------------------------------
test
nonautonomous!
第4行的rollback並沒有回滾,由於nonauto_proce過程不是自治事務,它的提交將父事務中的insert一並提交,造成rollback沒有回滾,即nonauto_proce影響了它的父事務。
下面再看一下auto_proce的情況。
[sql]
SQL> truncate table test;
表被截斷。
SQL> select * from test;
未選定行
SQL> begin
2 insert into test values('test1');
3 auto_proce;
4 rollback;
5 end;
6 /
PL/SQL 過程已成功完成。
SQL> select * from test;
www.2cto.com
M
------------------------------
autonomous!
由於auto_proce過程是自治事務,它的commit並沒有影響到其父事務的rollback。從結果中,已經證明了這一點。
通過這個例子,可以看出自治事務對其父事務並不會造成任何影響。
自治事務一般會被用於:
a 匿名塊
b 本地、對立或打包的函數或過程
c 對象類型的方法
d 觸發器
2、自治事務與父事務(調用者)的關系
創建一個過程,在commit前休眠10秒,以便查看系統中的一些信息。
[sql]
create or replace procere auto_p1
as
pragma AUTONOMOUS_TRANSACTION;
begin
insert into test values('test2');
dbms_lock.sleep(10);
commit;
end;
查看會話的SID(會話A)
www.2cto.com
[sql]
SQL> conn sys/admin as sysdba
已連接。
SQL> select sid from v$mystat where rownum=1;SID
----------
144
通過sqlplus打開另一個連接(會話B),查看會話信息[sql]
SQL> select sid, username, status from v$session;SID USERNAME STATUS---------- ------------------------------ --------138 ACTIVE143 SYS INACTIVE144 SYS INACTIVE145 SYS INACTIVE147 SYS ACTIVE149 ACTIVE151 ACTIVE157 ACTIVE159 ACTIVE160 ACTIVE161 ACTIVEwww.2cto.com
在會話A執行auto_p1
[sql]
SQL> begin
2 auto_p1;
3 end;
4 /
PL/SQL 過程已成功完成。
執行期間在會話B,查看會話信息
[sql]
SQL> select sid, username, status from v$session;SID USERNAME STATUS---------- ------------------------------ --------143 SYS INACTIVE144 SYS INACTIVE145 SYS INACTIVE147 SYS ACTIVE149 ACTIVE151 ACTIVE157 ACTIVE160 ACTIVE161 ACTIVE162 ACTIVE163 ACTIVE並沒有看到新的會話產生,即自治事務auto_p1與其父事務(匿名塊)在同一會話中。
www.2cto.com
3、應用場景
在Tom大師的《Oracle編程藝術》中,提到了這方面的內容 – 記錄錯誤日誌或者消息。想想做過的項目中,的確自治事務主要應用在這方面比較多,不管你的請求是否成功,只要訪問到資料庫,就要記錄在案,使用自治事務是一種比較不錯的方案(當然還有其他方案,因為此處只說自治事務,其他方案略過)。
還有隊列消息等基礎資料庫的消息類系統,也可以使用自治事務來記錄消息的發送,實際上也是日誌的記錄。
下面使用一個簡單的例子,說明一下。
創建兩張表,一張測試表(有主鍵),一張是測試表的錯誤日誌信息表。
[sql]
SQL> create table test1
( id number(8),
msg varchar2(10),
constraint test1_pk primary key(id)
);
表已創建。
[sql]
SQL> create table test1_log
2 ( dat timestamp,
3 err clob
4 );
表已創建。
創建自治事務,用於記錄操作測試表時出現的錯誤信息。
[sql]
SQL> create or replace procere log_err(errinfo varchar2)2 as
3 pragma autonomous_transaction;
4 begin
5 insert into test1_log values(systimestamp, errinfo);6 commit;
7 end;
8 / www.2cto.com
過程已創建。
創建一個過程用於向測試進行插入操作。
[sql]
SQL> create or replace procere insert_test(numid number, msg varchar2)2 as
3 begin
4 insert into test1 values (numid, msg);5 end;
6 /
過程已創建。
向測試表插入數據(沒有錯誤信息的情況)。
[sql]
SQL> begin
2 insert_test(1,'testtest');
3 insert_test(2,'test');
4 exception
5 when others
6 then
7 log_err(dbms_utility.format_error_backtrace);8 raise;
9 end;
10 /
PL/SQL 過程已成功完成。
[sql]
SQL> select * from test1_log;
www.2cto.com
未選定行
錯誤日誌表中沒有信息,測試表中的數據都是正確的。
下面再進行插入操作(違反測試表的主鍵約束,出現錯誤的情況)。
[sql]
SQL> begin
2 insert_test(1,'ffffffff');
3 exception
4 when others
5 then
6 log_err(dbms_utility.format_error_backtrace);7 raise;
8 end;
9 /
begin
*
第 1 行出現錯誤:
ORA-00001: 違反唯一約束條件 (SYS.TEST1_PK)ORA-06512: 在 line 7
[sql]
SQL> set linesize 1000
SQL> select * from test1_log;
www.2cto.com
DAT
ERR--------------------------------30-7月 -12 07.55.26.281000 下午 ORA-06512: 在 "SYS.INSERT_TEST", line 4ORA-06512: 在 line 2
插入操作沒有成功,測試表沒有新插入的數據,但是錯誤日誌表中,記錄個這次插入操作的錯誤信息。
上面的例子非常簡單,運用到應用系統中,還需要根據系統的需求進行改造。
⑥ SQL SEVER 怎麼把全國省份名字中的'省'去掉
看不到表,一般用replace函數
update表名set省份=replace(省名,'省','')
不過一般具有省行政權的還有直轄市和自治區,就要特殊處理了。
⑦ 如何產生唯一的server id
我們都知道MySQL用server-id來唯一的標識某個資料庫實例,並在鏈式或雙主復制結構中用它來避免sql語句的無限循環。這篇文章分享下我對server-id的理解,然後比較和權衡生成唯一server-id的幾種方式。
server_id的用途
簡單說來,server_id有兩個用途:
1. 用來標記binlog event的源產地,就是SQL語句最開始源自於哪裡。
2. 用於IO_thread對主庫binlog的過濾。如果沒有設置 replicate-same-server-id=1 ,那麼當從庫的io_thread發現event的源與自己的server-id相同時,就會跳過該event,不把該event寫入到relay log中。從庫的sql_thread自然就不會執行該event。這在鏈式或雙主結構中可以避免sql語句的無限循環。
注意:相同server-id的event在io_thread這一層就過濾了;而對於replicate-(do|ignore)-等規則,則是在sql_thread這一層過濾的。io_thread和sql_thread都有過濾的功能。
server_id為何不能重復
在同一個集群中,server-id一旦重復,可能引發一些詭異問題。
看看下面兩種情況:
圖1:主庫與從庫的server-id不同,但是兩個或多個從庫的server-id相同
這種情況下復制會左右搖擺。當兩個從庫的server-id相同時,如果從庫1已經連接上主庫,此時從庫2也需要連接到主庫,發現之前有server-id相同的連接,就會先注銷該連接,然後重新注冊。
參考下面的代碼片段:
repl_failsafe (register_slave) download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int register_slave(THD* thd, uchar* packet, uint packet_length)
{
int res;
SLAVE_INFO *si;
...
if (!(si->master_id= uint4korr(p)))
si->master_id= server_id;
si->thd= thd;
pthread_mutex_lock(&LOCK_slave_list);
/* 先注銷相同server-id的連接*/
unregister_slave(thd,0,0);
/* 重新注冊*/
res= my_hash_insert(&slave_list, (uchar*) si);
pthread_mutex_unlock(&LOCK_slave_list);
return res;
...
}
兩台從庫不停的注冊,不停的注銷,會產生很多relay log文件,查看從庫狀態會看到relay log文件名不停改變,從庫的復制狀態一會是yes一會是正在連接中。
圖2:鏈式或雙主結構中,主庫與從庫的server-id相同
從庫1同時又是relay資料庫,它能正確同步,然後把relay-log內容重寫到自己的binlog中。當server-id為100的從庫2 io線程獲取binlog時,發現所有內容都是源自於自己,就會丟棄這些event。因此從庫2無法正確同步主庫的數據。只有直接寫relay server的event能正確同步到從庫2。
上面兩種情況可以看到,在同一個replication set中,保持server-id的唯一性非常重要。
server_id的動態修改
無意中發現 server-id 竟然是可以動態修改的,可別高興的太早。好處是,上面圖1的情況下,直接修改其中一個從庫的server-id就可以解決server-id沖突的問題。壞處很隱蔽,如下圖的結構:
現在假設active-master因為某種原因與passive-master的同步斷開後,passive-master上進行了一些ddl變更。然後某dba突發奇想把passive-master的server-id修改為400。當雙master的復制啟動後,那些之前在passive-master上執行的server-id為200的ddl變更,會從此陷入死循環。如果是 alter table t engine=innodb ,它會一直不停,可能你會發現。但是像 update a=a+1; 這樣的sql,你很難發現。當然這種場景只是我的杜撰,這兒有個更真實的例子 主備備的兩個備機轉為雙master時出現的詭異slave lag問題 。
舉這兩個例子只是想說明修改server-id有點危險,最好不要去修改,那麼能一步到位生成它嗎?
如何生成唯一的server_id
常用的方法有如下幾種:
1. 採用隨機數
mysql的server-id是4位元組整數,范圍從0-4294967295,因此採用該范圍內的隨機數來作為server-id產生沖突的可能性是非常小的。
2. 採用時間戳
直接用date +%s來生成server-id。一天86400秒來計算,往後計算50年,最大的server-id也才使用到86400*365*50,完全在server-id范圍內。
3. 採用ip地址+埠
這是我們經常採用的方法。例如ip為192.168.122.23,埠為3309,那麼server-id可以寫為122233309。產生沖突的可能性比較小:遇到*.*.122.23 或者*.*.12.223,而且搭建了同一個replication set的3309才會出現。
4. 採用集中的發號器
在管理伺服器上採用自增的id來統一分配server-id。這可以保證不沖突,但是需要維護中心節點。
5. 分開管理每個replication set
在每個replication set中為mysql庫增加一個管理表,保證每個從庫的server-id不沖突。
哪一種更好
上面的幾種方法都不賴,但是:
1. 方法4加了維護負擔,而且開發環境、測試環境、線上環境都維護一套發號器的話,有點麻煩,混在一起又可能遇到網段隔離的風險,還有發號器資料庫許可權的問題難於控制。所以不推薦。
2. 方法5實現了自治,但是管理成本有點高。從庫要能夠寫主庫的server-id表,復雜。
3. 5種方法都存在的問題是,使用冷備的數據來擴容,server-id需要手動去修改,否則就與冷備源的server-id沖突。而且,當mysql啟動的時候,你無法判斷該mysql是剛通過備份擴容的,還是之前一直正常運行的。所以你不知道這個server-id到底要不要改。而我希望server-id對dba完全透明,又絕不產生沖突,即可徹底屏蔽這個討厭的東西。
建議的方法
其實很簡單。ipv4是4位元組的整數,與server-id的范圍完全一樣。我們認為只有ip地址+埠才能唯一的確定一個mysql實例,所以總是希望把ip信息和埠信息都集成到server-id中。但是別忘了,一個ip上不能同時啟動兩個一樣的埠。所以,server-id只需採用ip地址的整數形式!自定義的mysql啟動腳本強制對server-id進行檢查,發現server-id不對就進行糾正,然後啟動。上面所有的問題,都會迎刃而解。
⑧ 遠程連接SQL數據源
// S6_1Dlg.cpp : 實現文件
//
#include "stdafx.h"
#include "S6_1.h"
#include "S6_1Dlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 用於應用程序「關於」菜單項的 CAboutDlg 對話框
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// 對話框數據
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 實現
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()
// CS6_1Dlg 對話框
CS6_1Dlg::CS6_1Dlg(CWnd* pParent /*=NULL*/)
: CDialog(CS6_1Dlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
//初始化資料庫操作
ifbegin=TRUE;//第一次打開
CString m_dbstr,m_errmsg,m_SQLstr;
m_dbstr.Format("DSN=%s;UID=%s;PWD=%s","SampleDB","","");//資料庫名稱,用戶,口令
TRY{
if(m_db.IsOpen())
m_db.Close();
m_db.OpenEx(m_dbstr);//通過ODBC來打開資料庫
m_record=new CRecordset(&m_db);
m_SQLstr="select * from CustomerTable;";//准備要執行的SQL語句
if(m_record->IsOpen())
m_record->Close();
m_record->Open(CRecordset::dynaset,m_SQLstr);//執行SQL語句,得到記錄集
if(m_record->IsBOF())
AfxMessageBox("NO RECORD IN TABLE");//報告記錄集是否為空
}
CATCH_ALL(e){
e->GetErrorMessage(m_errmsg.GetBuffer(128),128);
AfxMessageBox(m_errmsg);
return;
}
END_CATCH_ALL
}
void CS6_1Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_EDIT1, m_userID);
DDX_Control(pDX, IDC_EDIT2, m_pwd);
DDX_Control(pDX, IDC_EDIT3, m_sex);
DDX_Control(pDX, IDC_EDIT4, m_old);
DDX_Control(pDX, IDC_EDIT5, m_Email);
DDX_Control(pDX, IDC_BUTTON1, m_button1);
DDX_Control(pDX, IDC_BUTTON2, m_button2);
}
BEGIN_MESSAGE_MAP(CS6_1Dlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1)
ON_BN_CLICKED(IDC_BUTTON2, OnBnClickedButton2)
ON_BN_CLICKED(IDCANCEL, OnBnClickedCancel)
END_MESSAGE_MAP()
// CS6_1Dlg 消息處理程序
BOOL CS6_1Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 將\「關於...\」菜單項添加到系統菜單中。
// IDM_ABOUTBOX 必須在系統命令范圍內。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 設置此對話框的圖標。當應用程序主窗口不是對話框時,框架將自動
// 執行此操作
SetIcon(m_hIcon, TRUE); // 設置大圖標
SetIcon(m_hIcon, FALSE); // 設置小圖標
// TODO:在此添加額外的初始化代碼
return TRUE; // 除非設置了控制項的焦點,否則返回 TRUE
}
void CS6_1Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// 如果向對話框添加最小化按鈕,則需要下面的代碼
// 來繪制該圖標。對於使用文檔/視圖模型的 MFC 應用程序,
// 這將由框架自動完成。
void CS6_1Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用於繪制的設備上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使圖標在工作矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 繪制圖標
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
//當用戶拖動最小化窗口時系統調用此函數取得游標顯示。
HCURSOR CS6_1Dlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CS6_1Dlg::OnBnClickedButton1()//查詢下一條記錄
{
// TODO:在此添加控制項通知處理程序代碼
CString m_errmsg;
CDBVariant m_value;//存放記錄中的欄位值
TRY{
if(ifbegin)
{
m_record->MoveFirst();
ifbegin=FALSE;
}
else
m_record->MoveNext();//移向下一條記錄
if(!m_record->IsEOF())
{
m_record->GetFieldValue("UserID",m_value);
m_userID.SetWindowText(*m_value.m_pstring);//得到userID
m_record->GetFieldValue("UserPassword",m_value);
m_pwd.SetWindowText(*m_value.m_pstring);//得到密碼
m_record->GetFieldValue("Sex",m_value);
m_sex.SetWindowText(*m_value.m_pstring);//得到用戶的性別
m_record->GetFieldValue("Old",m_value);
CString str;
str.Format("%d",m_value.m_iVal);
m_old.SetWindowText(str);//得到用戶的年齡
m_record->GetFieldValue("Email",m_value);
m_Email.SetWindowText(*m_value.m_pstring);//得到用戶的電子郵件地址
}
else
{
AfxMessageBox("已經到達記錄集尾,單擊『清除』按鈕可以返回記錄集頂端");
m_button1.EnableWindow(FALSE);//禁止再繼續查詢
}
}
CATCH_ALL(e){
e->GetErrorMessage(m_errmsg.GetBuffer(128),128);
AfxMessageBox(m_errmsg);
return;
}
END_CATCH_ALL
}
void CS6_1Dlg::OnBnClickedButton2()//清空編輯控制項中的數據
{
// TODO:在此添加控制項通知處理程序代碼
m_Email.SetWindowText("");
m_userID.SetWindowText("");
m_old.SetWindowText("");
m_pwd.SetWindowText("");
m_sex.SetWindowText("");
ifbegin=TRUE;//將資料庫重新置成新打開的狀態
m_button1.EnableWindow(TRUE);//允許重新開始查看記錄
}
void CS6_1Dlg::OnBnClickedCancel()
{
// TODO: 在此添加控制項通知處理程序代碼
OnCancel();
}
⑨ sql server 執行自定義存儲過程有哪些方法
比如,建立了一個
存儲過程
「procName」。
第一種情況:不用exec的
create
table
()..
GO
--注意這里的GO
表示要開始下一個事務了
procName
--這里直接使用存儲過程名字
就是調用了
第二種情況:一定要使用
exec的
create
table()
exec
procName
--看這里,它不是作為這個事務的第一句開始的
所以要帶上exec
備註:不帶
exec的執行存儲過程必須是事務的第一句
。
⑩ SQL觸發器,當表中有新行插入時,則立即更新該行的某列值
create or replace trigger tr_test before insert on test for each rowdeclarebegin :new.c:= :new:c+1;end ;
樓上的回答不正確,因為在插入之後(未提交)再次進行修改本行記錄,會提示錯誤。如果非要在插入之後在修改的話,那麼可以用自治事務來實現,但是我還是覺得在插入之前更新插入的值更好,不用插入、修改。