Мой параметр значения данных не соответствует параметру SQL Server ошибка: 200 состояние 7 - PullRequest
0 голосов
/ 09 октября 2018

Я пытаюсь загрузить данные от пользователей 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 в запросе выбора.Я получаю ту же ошибку

1 Ответ

0 голосов
/ 11 октября 2018

Я закончил тем, что изменил тип таблицы и хранимую процедуру.Код типа таблицы:

CREATE TYPE [dbo].[Test_IMS_ADUSER_TMP] AS TABLE(
[EmployID] [bigint] NOT NULL,
[DisplayName] [nvarchar](max) NOT NULL,
[FirstName] [nvarchar](50) NOT NULL,
[Initials] [nvarchar](10) NULL,
[LastName] [nvarchar](50) NOT NULL,
[mail] [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)

Код хранимой процедуры:

CREATE proc [dbo].[TestBulkInsertion-1] @datatable Test_IMS_ADUSER_TMP READONLY as begin insert into IMS_ADUSER([EmployID],[DisplayName],[FirstName],[Initials],[LastName],[Email][SamAccountName],[DistinguishedName],[ObjectGUID],[ObjectSid],[PhysicalDeliveryOfficeName])select EmployID,[DisplayName],[FirstName],[Initials],[LastName][mail],[SamAccountName],[DistinguishedName],[ObjectGUID],[ObjectSid],[PhysicalDeliveryOfficeName]from @datatable end

Загружен в исходную таблицу.Похоже, код C # был в порядке!Я ценю помощь!

...