使用日期和时间类型
适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)
此示例演示如何初始化 SQL Server 2008 (10.0.x) 中添加的日期/时间数据结构。 随后准备输入值、绑定参数,并执行查询。 有关使用这些类型的详细信息,请参阅日期和时间 改进 (ODBC) 。
示例
您将需要一个名为 DateTime 的 ODBC 数据源。 DateTime 的默认数据库应为 tempdb。 此数据源必须基于用于SQL Server Native Client的 ODBC 驱动程序。
如果您要将此示例构建为在 64 位操作系统上运行的 32 位应用程序并运行该示例,则必须使用 %windir%\SysWOW64\odbcad32.exe 中的 ODBC 管理器创建 ODBC 数据源。
此示例连接到计算机的默认SQL Server实例。 若要连接到命名实例,请更改 ODBC 数据源的定义以使用以下格式指定实例:server\namedinstance。 默认情况下,SQL Server Express 安装在命名实例中。
第一个 ( Transact-SQL) 代码列表创建此示例使用的表。
使用 odbc32.lib 和 user32.lib 编译第二个 (C++) 代码列表。 确保 INCLUDE 环境变量包含包含 sqlncli.h 的目录。
第三个 ( Transact-SQL) 代码列表将删除此示例使用的表。
use tempdb
GO
IF EXISTS (SELECT name FROM sysobjects WHERE name = 'DateTimeTypes')
DROP TABLE DateTimeTypes
GO
CREATE TABLE DateTimeTypes (datecol date, time2col time(7), datetime2col datetime2(7), datetimeoffsetcol datetimeoffset(7))
GO
// compile with: odbc32.lib user32.lib
#include <windows.h>
#include <Sqlext.h>
#include <mbstring.h>
#include <sqlncli.h>
#include <stdio.h>
#define MAX_DATA 1024
#define MYSQLSUCCESS(rc) ( (rc == SQL_SUCCESS) || (rc == SQL_SUCCESS_WITH_INFO) )
class direxec {
RETCODE rc; // ODBC return code
HENV henv; // Environment
HDBC hdbc; // Connection Handle
HSTMT hstmt; // Statement Handle
SQLHDESC hdesc; // Descriptor handle
unsigned char szData[MAX_DATA]; // Returned Data Storage
SDWORD cbData; // Output Length of data
unsigned char char_ds_name[SQL_MAX_DSN_LENGTH]; // Data Source Name
SQL_DATE_STRUCT date; // date structure
SQL_SS_TIME2_STRUCT time2; // time2 structure
SQL_TIMESTAMP_STRUCT datetime2; // datetime2 structure
SQL_SS_TIMESTAMPOFFSET_STRUCT dateTimeOffset; // datetimeoffset structure
SQLLEN cbdate; // size of date structure
SQLLEN cbtime2; // size of time structure
SQLLEN cbdatetime2; // size of datetime2
SQLLEN cbtimestampoffset; //size of dateTimeOffset
public:
direxec(); // Constructor
void sqlconn(); // Allocate env, stat and conn
void sqldisconn(); // Free pointers to env, stat, conn and disconnect
void error_out(); // Display errors
void check_rc(RETCODE rc); // Checks for success of the return code
void sqlinsert(); // Insert into the table
};
// Constructor initializes the string char_ds_name with the data source name and
// initialize the data structures to with the date to be inserted.
direxec::direxec() {
_mbscpy_s(char_ds_name, (const unsigned char *)"DateTime");
// Initialize the date structure
date.day = 12;
date.month = 10;
date.year = 2001;
// Initialize the time structure
time2.hour = 21;
time2.minute = 45;
time2.second = 52;
time2.fraction = 100 ;
// Initialize the datetime2 structure
datetime2.year = 2007;
datetime2.month = 12;
datetime2.day = 26;
datetime2.hour = 0;
datetime2.minute = 0;
datetime2.second = 0;
datetime2.fraction = 100;
// Initialize the timestampoffset structure
dateTimeOffset.year = 2007;
dateTimeOffset.month = 3;
dateTimeOffset.day = 11;
dateTimeOffset.hour = 2;
dateTimeOffset.minute = 30;
dateTimeOffset.second = 29;
dateTimeOffset.fraction = 200;
dateTimeOffset.timezone_hour = -8;
dateTimeOffset.timezone_minute = 0;
// Size of structures
cbdate = sizeof(SQL_DATE_STRUCT);
cbtime2 = sizeof(SQL_SS_TIME2_STRUCT);
cbdatetime2 = sizeof(SQL_TIMESTAMP_STRUCT);
cbtimestampoffset = sizeof(SQL_SS_TIMESTAMPOFFSET_STRUCT);
} // direxec
// Allocate environment handles, connection handle, connect to data source, and allocate statement handle
void direxec::sqlconn() {
// Allocate the environment handle
rc = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
check_rc(rc);
// Set the ODBC version to version 3
rc = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3, SQL_IS_INTEGER);
check_rc(rc);
// Allocate the database connection handle
rc = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
check_rc(rc);
// Connect to the database
rc = SQLConnect(hdbc, char_ds_name, SQL_NTS, NULL, 0, NULL, 0);
check_rc(rc);
// Allocate the statement handle
rc = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
check_rc(rc);
// Allocate the descriptor handle
rc = rc = SQLAllocHandle(SQL_HANDLE_DESC, hdbc, &hdesc);
check_rc(rc);
} // direxec::sqlconn
// Display error message from the DiagRecord
void direxec::error_out() {
// String to hold the SQL State
unsigned char szSQLSTATE[10];
// Error code
SDWORD nErr;
// The error message
unsigned char msg[SQL_MAX_MESSAGE_LENGTH + 1];
// Size of the message
SWORD cbmsg;
// If hstmt is not null use that for getting the DiagRec
if (hstmt)
rc = SQLGetDiagRec(SQL_HANDLE_STMT, hstmt, 1, szSQLSTATE, &nErr, msg, sizeof(msg), &cbmsg);
// else get the diag record from the env
else
rc = SQLGetDiagRec(SQL_HANDLE_ENV, henv, 1, szSQLSTATE, &nErr, msg, sizeof(msg), &cbmsg);
// If the rc is successful, show the message using a message box
if ( rc == SQL_SUCCESS) {
char hold_err[100];
_itoa_s(nErr, hold_err, 100, 10);
_snprintf_s((char *)szData, MAX_DATA, MAX_DATA - 1, "%s" "%s" "%s" "%s" "%s" "%s" "%s" "%s",
"Error:", "\n", "SQLSTATE= ", szSQLSTATE, ", Native error=", hold_err, ", msg = ", msg);
MessageBox(NULL, (const char *)szData, "ODBC Error", MB_OK);
}
} // direxec::error_out
// Checks the return code. If failure, displays the error, free the memory and exits the program
void direxec::check_rc(RETCODE rc) {
if (!MYSQLSUCCESS(rc)) {
error_out();
SQLFreeEnv(henv);
SQLFreeConnect(hdbc);
exit(-1);
}
} // direxec::check_rc
// Function to insert dates into the table.
void direxec::sqlinsert() {
rc = SQLPrepare(hstmt, (SQLCHAR *) "INSERT INTO DateTimeTypes (datecol, time2col, datetime2col, datetimeoffsetcol) VALUES (?, ?, ?, ?)", SQL_NTS);
check_rc(rc);
rc = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_TYPE_DATE, SQL_TYPE_DATE, 10, 0, &date, 0, &cbdate);
check_rc(rc);
rc = SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_BINARY, SQL_SS_TIME2, 16, 7, &time2, 0, &cbtime2);
check_rc(rc);
rc = SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_TIMESTAMP, SQL_TYPE_TIMESTAMP, 27, 7, &datetime2, 0, &cbdatetime2);
check_rc(rc);
rc = SQLBindParameter(hstmt, 4, SQL_PARAM_INPUT, SQL_C_BINARY, SQL_SS_TIMESTAMPOFFSET, 34, 7, &dateTimeOffset, 0, &cbtimestampoffset);
check_rc(rc);
rc = SQLExecute(hstmt);
check_rc(rc);
} // direxec::sqlinsert
int main() {
direxec x;
// Allocate handles, and connect.
x.sqlconn();
// Insert all into the table
x.sqlinsert();
}
USE tempdb
GO
IF EXISTS (SELECT name FROM sysobjects WHERE name = 'DateTimeTypes')
DROP TABLE DateTimeTypes
GO
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈