Я пытаюсь загрузить данные от пользователей Active Directory в таблицу, в которой есть дополнительные данные в таблице.
Структура таблицы:
CREATE TABLE [dbo].[IMS_ADUSER-test2]
(
[IMSuserID] [bigint] NOT NULL,
[EmployID] [bigint] NOT NULL,
[DisplayName] [nvarchar](max) NOT NULL,
[FirstName] [nvarchar](50) NOT NULL,
[Initials] [nvarchar](10) NULL,
[LastName] [nvarchar](50) NOT NULL,
[Email] [nvarchar](100) NOT NULL,
[SamAccountName] [nvarchar](50) NOT NULL,
[DistinguishedName] [nvarchar](max) NOT NULL,
[ObjectGUID] [nvarchar](100) NOT NULL,
[ObjectSid] [nvarchar](100) NOT NULL,
[physicalDeliveryOfficeName] [nvarchar](50) NOT NULL,
[CreateDate] [datetime] NOT NULL,
[ModifiedBy] [nvarchar](50) NOT NULL,
[UpdateDate] [datetime] NULL,
[IsDisabled] [bit] NULL,
[DisabledDate] [datetime] NULL,
[IMS_USER_ID_FK] [bigint] NULL,
[AccountClosedDate] [datetime] NULL
)
Мой тип таблицы:
CREATE TYPE [dbo].[TestC_IMS_ADUSER_TMP] AS TABLE
(
[IMSuserID] [bigint] NOT NULL,
[EmployID] [bigint] NOT NULL,
[DisplayName] [nvarchar](max) NOT NULL,
[FirstName] [nvarchar](50) NOT NULL,
[Initials] [nvarchar](10) NULL,
[LastName] [nvarchar](50) NOT NULL,
[Email] [nvarchar](100) NOT NULL,
[SamAccountName] [nvarchar](50) NOT NULL,
[DistinguishedName] [nvarchar](max) NOT NULL,
[ObjectGUID] [nvarchar](100) NOT NULL,
[ObjectSid] [nvarchar](100) NOT NULL,
[physicalDeliveryOfficeName] [nvarchar](50) NULL,
[CreateDate] [datetime] NOT NULL,
[ModifiedBy] [nvarchar](50) NOT NULL,
[UpdateDate] [datetime] NULL,
[IsDisabled] [bit] NULL,
[DisabledDate] [datetime] NULL,
[IMS_USER_ID_FK] [bigint] NULL,
[AccountClosedDate] [datetime] NULL
)
Моя хранимая процедура:
CREATE PROCEDURE TestBulkInsertion-2
@datatable TestC_IMS_ADUSER_TMP READONLY
AS
BEGIN
INSERT INTO IMS_ADUSER-test2 (IMSuserID, EmployID, DisplayName, FirstName, Initials, LastName,
Email, SamAccountName, DistinguishedName, ObjectGUID, ObjectSid,
physicalDeliveryOfficeName, CreateDate, ModifiedBy, UpdateDate, IsDisabled, IMS_USER_ID_FK, AccountClosedDate)
SELECT
NEXT VALUE FOR sequence_test, EmployID, DisplayName, FirstName, Initials, LastName,
Email, SamAccountName, DistinguishedName, ObjectGUID, ObjectSid,
physicalDeliveryOfficeName, GETDATE(), SYSTEM_USER, UpdateDate, IsDisabled, IMS_USER_ID_FK, AccountClosedDate
FROM
@datatable
END
Ошибка, которую я получаю:
Необработанное исключение: System.Data.SqlClient.SqlException:Тип операнда clash: datetime2 несовместим с битом
Данные для табличного параметра "@datatable" не соответствуют табличному типу параметра.Ошибка SQL Server: 200, состояние: 7
в System.Data.SqlClient.SqlConnection.OnError (исключение SqlException, логическое breakConnection, действие 1 wrapCloseInAction)<br>
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action
1 wrapCloseInAction)
в System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning (TdsParserStateObject stateObj, булева callerHasConnectionLock, булева asyncClose)
в System.Data.SqlClient.TdsParser.TryRun (runBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader DATASTREAM, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean & dataReady) * * на тысячу двадцать-одна системе.Data.SqlClient.SqlCommand.FinishExecuteReader (SqlDataReader Д.С., runBehavior runBehavior, String resetOptionsString, Boolean IsInternal, Boolean forDescribeParameterEncryption)
в System.Data.SqlClient.SqlCommand.RunExecuteReaderTds (CommandBehavior cmdBehavior, runBehavior runBehavior, булевой returnStream, Boolean асинхронном,Тайм-аут Int32, Задача и задание, Логическое асинхронное письмо, Логическое значение inRetry, SqlDataReader ds, Логическое описаниеParameterEncryptionRequest.Boolean inRetry) в System.Data.SqlClient.SqlCommand.ExecuteNonQuery () в LoadADuserIntoDataBase.DataAccess.DataAccess.InsertADuserTabe (DataTable dt) в c: \ users \ 1089907450e \ documentsInataDataBataDataBD.cs: строка 28 в LoadADuserIntoDataBase.Program.Main (String [] args) в c: \ users \ 1089907450e \ documents \ visual studio 2015 \ Projects \ LoadADuserIntoDataBase \ LoadADuserIntoDataBase \ Program.cs: строка 23
Как вы можете видеть, ошибка говорит о том, что мой тип таблицы имеет datetime2 несовместим с моим битом.SQL-сервер кажется надежным.Я не вижу, в чем проблема.
Мои программы доступа к данным:
public void InsertADuserTabe(DataTable dt)
{
using(SqlConnection con = new SqlConnection(dbString()))
{
var dtAD = dt;
var cmd = new SqlCommand("TestBulkInsertion-2", con) { CommandType =
CommandType.StoredProcedure };
cmd.Parameters.Add(new SqlParameter("@datatable", dt));
con.Open();
cmd.ExecuteNonQuery();
}
}
Мой код:
public static DataTable GetADusers()
{
try
{
string ou = "OU"
using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain,
Environment.UserDomainName, ou))
{
UserPrincipal user = new UserPrincipal(ctx);
using (PrincipalSearcher ps = new PrincipalSearcher(user))
{
DataTable results = new DataTable();
results.Columns.Add("EmployeeID");
results.Columns.Add("DisplayName ");
results.Columns.Add("FirstName");
results.Columns.Add("Initial");
results.Columns.Add("LastName");
results.Columns.Add("mail");
results.Columns.Add("SamAccountName");
results.Columns.Add("DistinguishedName");
results.Columns.Add("ObjectGUID");
results.Columns.Add("objectSid");
results.Columns.Add("physicalDeliveryOfficeName");
int count = 0;
foreach (Principal p in ps.FindAll())
{
UserPrincipal u = p as UserPrincipal;
if (u != null)
{
DirectoryEntry entry =
(DirectoryEntry)p.GetUnderlyingObject();
DirectorySearcher search = new DirectorySearcher(entry);
//string query = "(&(objectCategory=person)
(objectClass=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(&(mail=*)))";
//UAC - CAC Enabled Accounts (no disabled accounts or
password never expires) and has a Email Account
string query = "(&(objectCategory=person)(objectClass=user)
(!userAccountControl:1.2.840.113556.1.4.803:=2)
(!userAccountControl:1.2.840.113556.1.4.803:=65536)
(userAccountControl:1.2.840.113556.1.4.803:=262144)(userPrincipalName=1*@mil)(mail=*))";
search.Filter = query;
search.PropertiesToLoad.Add("EmployeeID");
search.PropertiesToLoad.Add("DisplayName");
search.PropertiesToLoad.Add("GivenName");
search.PropertiesToLoad.Add("Initials");
search.PropertiesToLoad.Add("sn");
search.PropertiesToLoad.Add("mail");
search.PropertiesToLoad.Add("SamAccountName");
search.PropertiesToLoad.Add("DistinguishedName");
search.PropertiesToLoad.Add("ObjectGUID");
search.PropertiesToLoad.Add("objectSid");
search.PropertiesToLoad.Add("physicalDeliveryOfficeName");
SearchResultCollection mySearchResultColl = search.FindAll();
foreach (SearchResult sr in mySearchResultColl)
{
DataRow dr = results.NewRow();
DirectoryEntry de = sr.GetDirectoryEntry();
dr["EmployeeID"] = de.Properties["EmployeeID"].Value;
dr["DisplayName "] = de.Properties["DisplayName"].Value;
dr["FirstName"] = de.Properties["GivenName"].Value;
dr["Initial"] = de.Properties["Initials"].Value;
dr["LastName"] = de.Properties["sn"].Value;
dr["mail"] = de.Properties["mail"].Value;
dr["SamAccountName"] =
de.Properties["SamAccountName"].Value;
dr["DistinguishedName"] =
de.Properties["DistinguishedName"].Value;
//var GUID = new
Guid((byte[])de.Properties["ObjectGUID"].Value);
dr["ObjectGUID"] = new
Guid((byte[])de.Properties["ObjectGUID"].Value);
//var sid = new
SecurityIdentifier((byte[])de.Properties["objectSid"].Value, 0);
dr["objectSid"] = new
SecurityIdentifier((byte[])de.Properties["objectSid"].Value, 0);
dr["physicalDeliveryOfficeName"] =
de.Properties["physicalDeliveryOfficeName"].Value;
//dr["guid"] = de.Properties["guid"].Value;
results.Rows.Add(dr);
count++;
}
}
}
return results;
//DataView DV = new DataView(results);
//dgvActiveDirectory.DataSource = DV;
//lblCount.Text = count.ToString();
}
}
}
catch (NullReferenceException ex)
{
Console.WriteLine("data error" + ex);
DataTable dt = new DataTable();
return dt;
}
}
У меня есть оболочка:
public static DataTable AddColumns(DataTable dt)
{
DataColumn PK = new DataColumn("IMSuserID", typeof(System.Int64));
DataColumn user = new DataColumn("ModifiedBy", typeof(System.String));
DataColumn CreateDate = new DataColumn("CreateDate", typeof(System.DateTime));
//Required Data
dt.Columns.Add(PK);
dt.Columns.Add(user);
dt.Columns.Add(CreateDate);
//non required data
DataColumn FK = new DataColumn("IMS_USER_ID_FK", typeof(System.Int64));
DataColumn Update = new DataColumn("UpdateDate", typeof(System.DateTime));
DataColumn IsDeleted = new DataColumn("IsDisabled", typeof(System.Boolean));
DataColumn DisabledDate = new DataColumn("DisabledDate",
typeof(System.DateTime));
DataColumn ClosedDate = new DataColumn("AccountClosedDate", typeof(System.DateTime));
dt.Columns.Add(FK);
//FK.DefaultValue = null;
dt.Columns.Add(Update);
//Update.DefaultValue = null;
dt.Columns.Add(IsDeleted);
//IsDeleted.DefaultValue = null;
dt.Columns.Add(DisabledDate);
//DisabledDate.DefaultValue = null;
dt.Columns.Add(ClosedDate);
//ClosedDate.DefaultValue = null;
return dt;
}
Реализация такова:
static void Main(string[] args)
{
DataAccess.DataAccess da = new DataAccess.DataAccess();
//da.InsertADuserTabe(GetADusers());
da.InsertADuserTabe(AddColumns(GetADusers()));
Console.WriteLine("Done");
//DataAccess da = new LoadADuserIntoDataBase.DataAccess();
//InsertADuserTabe(GetADusers());
}
Как видите, нет никаких причин для того, чтобы тип операнда clash datetime2 был несовместим с битом.Я нахожусь в тупике.Буду признателен за любую помощь.
Я изменяю таблицу, чтобы добавить последовательность в качестве значения по умолчанию: Последовательность в качестве значения по умолчанию
Я также изменил хранимую процедуру на:
alter PROCEDURE [dbo].[TestBulkInsertion-2] @datatable TestC_IMS_ADUSER_TMP READONLY AS BEGIN
insert INTO MS_ADUSER-test4
(IMSuserID, EmployID,DisplayName,FirstName,Initials,LastName,Email,SamAccountName,DistinguishedName,ObjectGUID,ObjectSid,physicalDeliveryOfficeName,CreateDate,ModifiedBy,UpdateDate, IsDisabled, IMS_USER_ID_FK,AccountClosedDate )
SELECT IMSuserID, EmployID,DisplayName,FirstName,Initials,LastName,Email,SamAccountName,DistinguishedName,ObjectGUID,ObjectSid,physicalDeliveryOfficeName,GETDATE(),SYSTEM_USER,UpdateDate, IsDisabled, IMS_USER_ID_FK,AccountClosedDate
FROM @datatable END
Как видите, я заменил последовательность на фактическое имя colomn в запросе выбора.Я получаю ту же ошибку