在SQL Server中,ID是非空整数和标识.
当我运行以下代码时,我在最后一行得到一个InvalidCastException:
SqlCommand cmd = new SqlCommand();
cmd.Connection = _conn;
cmd.CommandText = @"INSERT INTO [Users] (Name, Email, Password) VALUES (@name, @email, @pass); SELECT SCOPE_IDENTITY()";
cmd.Parameters.AddWithValue("@name", newUser.Name);
cmd.Parameters.AddWithValue("@email", newUser.Email);
cmd.Parameters.AddWithValue("@pass", newUser.PasswordHash);
int id = (int)cmd.ExecuteScalar();
Run Code Online (Sandbox Code Playgroud)
什么是ExecuteScalar()在这里返回?无论它返回什么,都有一个ToString()使它看起来像一个数字,所以这个可怕的代码行工作:
int id = Int32.Parse(cmd.ExecuteScalar().ToString());
Run Code Online (Sandbox Code Playgroud) 我在表上使用INSTEAD OF插入触发器来设置行上的递增版本号,并将行复制到第二个历史/审计表.
行没有问题地插入到两个表中.
但是,我无法将第一个表中的新标识返回给用户.
CREATE TABLE Table1
(
id INT IDENTITY(1,1) PRIMARY KEY,
name VARCHAR(250) NOT NULL UNIQUE,
rowVersion INT NOT NULL
)
CREATE TABLE Table1History
(
id INT NOT NULL,
name VARCHAR(250) NOT NULL,
rowVersion INT NOT NULL
)
CREATE TRIGGER TRG_INS_Table1
ON Table1
INSTEAD OF INSERT
AS
DECLARE @OutputTbl TABLE (id INT, name VARCHAR(250))
BEGIN
--make the insert
INSERT INTO Table1 (name, rowVersion)
OUTPUT INSERTED.id, INSERTED.name INTO @OutputTbl(id, name)
SELECT i.name, 1
FROM INSERTED i
--copy into …Run Code Online (Sandbox Code Playgroud) 我正在使用存储过程将值放入SQL Server.过程将向添加的行添加ID.我需要将此ID返回到我的代码中.
目前我可以在Visual Studio的OUTPUT窗口中看到输出ID,但似乎无法在我的代码中捕获它.以下是proc的摘要版本:
SQL:
CREATE PROCEDURE dbo.DoSomething
(
@var1 INT = NULL,
@var2 INT = NULL,
@var3 DATE = NULL
)
AS
BEGIN
INSERT INTO atable
(
vara,
varb,
varc
)
VALUES
(
@var1,
@var2,
@var3
)
RETURN SCOPE_IDENTITY()
END
Run Code Online (Sandbox Code Playgroud)
C#:
int result = 0;
/// create command
SqlCommand cmd = new SqlCommand("DoSomething", this.OpenSqlConnection());
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@var1", thing.value1);
cmd.Parameters.AddWithValue("@var2", thing.value2);
cmd.Parameters.AddWithValue("@var3", thing.value3);
/// send data to db
result = (int)cmd.ExecuteScalar();
Run Code Online (Sandbox Code Playgroud)
所以我收到一个错误:对象引用未设置为对象的实例.当它到达(int)cmd.ExecuteScalar()时.
有任何想法吗?
我正在存储过程中构建一个动态插入语句.
我在变量中构建sql语法然后用它执行它EXEC(@VarcharVariable).
SQL插件工作正常,但是当我执行SET @Record_ID = Scope_Identity()后,我没有得到一个值.
我怎么能抓住这个?我需要把它包裹进去EXEC吗?
我有PK是自增量键.我需要将记录插入数据库,然后将PK恢复并在另一个插入中使用它.
但是我想在一次交易中这样做.那可能吗.我的想法是,如果在我必须做的任何更新/插入中出现故障,那么我可以回滚所有内容,但我的印象是我需要进行提交.
我最初会在ado.net中这样做,但后来切换到存储过程,因为我认为可能会解决这个问题.
在这种情况下,SP会帮助我吗?
我有一个SQL Server作为asp.net应用程序的后端.多个人可能会在同一个表中"同时..."插入数据.
当我从这篇文章中读到解决方案/答案时:scope_identity vs ident_current
然后我不应该使用,Ident_current因为我可以得到另一个用户的插入的ID.
但是使用Select Scope_Identity();返回NULL时Select IDENT_CURRENT('tableName')返回我使用SQL Server Management Studio检查的正确ID.
插件语句我在一个SqlTransaction.这Select IDENT_CURRENT('tableName')是在交易完成后完成的.
我错了什么?
更新:
我的insert语句由基类动态构建:
INSERT INTO TEST (NAME) VALUES (@Name)
Run Code Online (Sandbox Code Playgroud)
命令的参数集合的值为"xxx",并且所有内容都可以很好地插入到表中.
我不使用纯粹SqlDataReader的C#存储过程.
commandText = "INSERT INTO TEST (NAME) VALUES ('Test1');Select Scopy_Identity();"
Run Code Online (Sandbox Code Playgroud)
我怎样才能运行上面的语句中的最后自动INC ID和我应该打电话ExecuteNonQuery或ExecuteReader为上述,因为它有一个INSERT和SELECT这混乱...
浏览了一些答案,似乎并不适合我.
我需要返回一个表的ID字段,所以我可以在程序的不同部分使用它,我尝试过使用
Convert.ToInt32(sqlComm.ExecuteScalar());
Run Code Online (Sandbox Code Playgroud)
但没有运气,同样如此
Convert.ToInt32(sqlComm.Parameters["ID"].Value);
Run Code Online (Sandbox Code Playgroud)
并且两者都返回0,即使记录已插入表中.
我将转储下面的代码,任何人都可以看到我做错了什么?
using (SqlConnection sqlConnect = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
{
using (SqlCommand sqlComm = new SqlCommand("up_Insert_Address", sqlConnect))
{
sqlComm.CommandType = CommandType.StoredProcedure;
sqlComm.Parameters.Add("@AddressID", SqlDbType.BigInt).Direction = ParameterDirection.Output;
sqlComm.Parameters.Add("@AddressLineOne", SqlDbType.NVarChar, 40).Value = address.AddressLineOne;
try
{
sqlComm.Connection.Open();
return Convert.ToInt32(sqlComm.ExecuteScalar());
}
catch (SqlException)
{
}
finally
{
sqlComm.Connection.Close();
}
}
}
Run Code Online (Sandbox Code Playgroud)
和存储过程:
@AddressID Bigint OUTPUT,
@AddressLineOne NVarChar(40)
AS
BEGIN
BEGIN TRY
INSERT INTO Address
(
AddressLineOne
)
VALUES
(
@AddressLineOne
)
SET @AddressID = SCOPE_IDENTITY();
END TRY
BEGIN CATCH
DECLARE @Err …Run Code Online (Sandbox Code Playgroud) 我有以下表结构,为方便起见我只标记单个列
Table_A(Id, Name, Desc)Table_1(Id 这是标识栏,Name....)Table_2(Id 这是标识列,Table_A_Id,Table_1_Id)Table_1和Table_2之间的关系是 1...*
现在我已经为Table_A被调用创建了一个表类型TType_Table_A(它只包含Id作为列,并且从我的C#应用程序中我发送了多个记录).我已根据需要实现了这种批量插入功能.
当我记录插入到我需要的是Table_2从TType_Table_A下面的语句说,我想捕捉Id的Table_2用于插入的每个记录
declare @count int = (select count(*) from @TType_Table_A); --a variable declared for TType_Table_A
if(@count > 0)
begin
insert into Table_2(Table_A_Id,Table_1_Id)
SELECT @SomeValue, @SomeValueAsParameter FROM @TType_Table_A;
end;
Run Code Online (Sandbox Code Playgroud)
现在说如果插入2条记录,我想捕获Id这2条记录中的每条记录.
任何输入/帮助表示赞赏
这就是我所知道的如何实现,但我希望减少存储过程中来自我的应用程序或用户光标的数据库调用
在Table_1中插入记录并返回Id循环.....通过记录并在表2中插入记录并返回Id
要么
从TableType插入/选择时,在存储过程中使用游标
如何获取策略表中创建的最后一个ID并将其存储到变量中,以便我可以将其用于另一个名为backupspec table的表.
System.Data.SqlClient.SqlConnection dataConnection = new SqlConnection();
dataConnection.ConnectionString =
@"Data Source=JAGMIT-PC\SQLEXPRESS;Initial Catalog=SumooHAgentDB;Integrated Security=True";
System.Data.SqlClient.SqlCommand dataCommand = new SqlCommand();
dataCommand.Connection = dataConnection;
//tell the compiler and database that we're using parameters (thus the @first, @last, @nick)
dataCommand.CommandText = ("Insert Policies ( PolicyName, PolicyDesc, TimeAdded,OSFlag, CreateVSSSnapshot, CreateAuditLogForRecoveries, AllowUsersToOverwriteFiles, AutoHandleEnvErrors, NotifyOnEnvErrorCount, NotifyOnFileFailure, NotifyOnFileFailureCount, NotifyOnLackOfPCContact, NotifyOnLackOfPCContactDays, NotifyOnRecoveryFailures, NotifyOnRecoveryFailureReason) values (@pn,@pd,@TimeAdded,@os,@vss,@al,@uow,@hee,@oeec,@off,@offc,@oloc,@olocd,@orf,@orfr)");
dataCommand.Parameters.AddWithValue("@pn",pn);
dataCommand.Parameters.AddWithValue("@pd",pd);
dataCommand.Parameters.AddWithValue("@TimeAdded",TimeAdded);
dataCommand.Parameters.AddWithValue("@os",os);
dataCommand.Parameters.AddWithValue("@vss",vss);
dataCommand.Parameters.AddWithValue("@al",al);
dataCommand.Parameters.AddWithValue("@uow",uow);
dataCommand.Parameters.AddWithValue("@hee",hee);
dataCommand.Parameters.AddWithValue("@oeec",oeec);
dataCommand.Parameters.AddWithValue("@off",off);
dataCommand.Parameters.AddWithValue("@offc",offc);
dataCommand.Parameters.AddWithValue("@oloc",oloc);
dataCommand.Parameters.AddWithValue("@olocd",olocd);
dataCommand.Parameters.AddWithValue("@orf",orf);
dataCommand.Parameters.AddWithValue("@orfr",orfr);
dataConnection.Open();
dataCommand.ExecuteNonquery();
dataConnection.Close();
ArrayList jaja = (ArrayList)Session["BackupSpecList"];
for (int …Run Code Online (Sandbox Code Playgroud) c# asp.net sql-server-2005 visual-studio-2008 scope-identity
我的SQL Server表之间有这些列.
自动识别具有IdentitySpecification设置为True并且GuidKey其具有默认值(NEWID())
AutoID GuidKey
1 f4rc-erdd
2 gedd-rrds
Run Code Online (Sandbox Code Playgroud)
有没有办法从插入的行中获取GuidKey?
我需要像Scope_Identity()这样的东西,区别在于我不想获得AutoID的内容,而是GuidKey列.
我在SELECT Scope_Identity()中收到错误
我正在从表单中插入一行新数据.该行生成自动标记的ID(RBID).
我试图立即抓住它并将其(RBID)插入另一行,因此可以在需要时引用它.
<cfquery name="recbilling" datasource="#request.dsn#" result="myResult">
INSERT INTO RBilling
(CID, UserID, DateCompleted, ClientID, Title, Qty, Rate, Taxable, Description, NextBillingDate,
FrequencyUnit, FrequencyDuration, ProjectID)
VALUES (
<cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#CID#">,
<cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#UserID#">,
<cfqueryparam cfsqltype="CF_SQL_TIMESTAMP" value="#DateCompleted#">,
<cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#ClientID#">,
<cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#text0#">,
<cfqueryparam cfsqltype="CF_SQL_REAL" value="#Qty#">,
<cfqueryparam cfsqltype="CF_SQL_REAL" value="#text2#">,
<cfqueryparam cfsqltype="CF_SQL_BIT" value="#Taxable#">,
<cfqueryparam cfsqltype="CF_SQL_LONGVARCHAR" value="#text1#">,
<cfqueryparam cfsqltype="CF_SQL_TIMESTAMP" value="#NextBillingDate#">,
<cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#FrequencyUnit#">,
<cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#FrequencyDuration#">,
<cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#ProjectID#">)
</cfquery>
<cfquery name="getRBID" datasource="#request.dsn#">
SELECT Scope_Identity() as newID
</cfquery>
<cfset RBID = #getRBID.newID#>
</cfif>
<cfquery …Run Code Online (Sandbox Code Playgroud) 我有一个问题从插入语句获取范围标识.我之前已经做了很多次,但总是有定义的值:
INSERT INTO t_table (field1, Field2)
VALUES (field1Val, field2Val);
SET @id = SCOPE_IDENTITY()
Run Code Online (Sandbox Code Playgroud)
当您通过从另一个表运行select来获取插入的值时,如何执行此操作?
INSERT INTO t_table (field1, Field2)
SELECT value1, value2 FROM #tempTable;
SET @id = SCOPE_IDENTITY()
Run Code Online (Sandbox Code Playgroud)
以上运行没有错误,但@id为空
scope-identity ×12
sql-server ×9
sql ×6
c# ×4
t-sql ×3
ado.net ×2
asp.net ×1
bulkinsert ×1
coldfusion ×1
return-value ×1
triggers ×1