excel den sql server 2000 atarken hata field inckeyno cannot

MS SQL Server veritabanı ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
a4tech

excel den sql server 2000 atarken hata field inckeyno cannot

Mesaj gönderen a4tech »

selamünaleyküm...............

Excel den aynı sütün büyüklüğündeki tabloyu aynı sütün büyüklüğünde sql server 2000 deki table parse edicem...hersey tamam fakat....query analyzer da set identity on yazdığım halde yine parse etmiyor veriyi...Ne yapmam gerekli...
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2247
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

A.S.

Şimdi hata mesajını tam olarak yazarsanız ve excel'deki fieldları veya tabloyu, aynı zamanda MS-SQL Server'daki tablo yapısını ve tam olarak yapmak istediğinizi biraz daha detaylı yazarsanız yardımcı olabiliriz.

Kolay Gelsin.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
a4tech

sql server 2000 database bilgileri ve codelar

Mesaj gönderen a4tech »

bu sql deki tablo

Kod: Tümünü seç

STOK_KODU	FISNO	STHAR_GCMIK	STHAR_GCMIK2	CEVRIM	STHAR_GCKOD	STHAR_TARIH	STHAR_NF	STHAR_BF	STHAR_IAF	STHAR_KDV	DEPO_KODU	STHAR_ACIKLAMA	STHAR_SATISK	STHAR_MALFISK	STHAR_FTIRSIP	STHAR_SATISK2	LISTE_FIAT	STHAR_HTUR	STHAR_DOVTIP	PROMASYON_KODU	STHAR_DOVFIAT	STHAR_ODEGUN	STRA_SATISK3	STRA_SATISK4	STRA_SATISK5	STRA_SATISK6	STHAR_BGTIP	STHAR_KOD1	STHAR_KOD2	STHAR_SIPNUM	STHAR_CARIKOD	STHAR_SIP_TURU	PLASIYER_KODU	EKALAN_NEDEN	EKALAN	EKALAN1	REDMIK	REDNEDEN	SIRA	STRA_SIPKONT	AMBAR_KABULNO	FIRMA_DOVTIP	FIRMA_DOVTUT	FIRMA_DOVMAL	UPDATE_KODU	IRSALIYE_NO	IRSALIYE_TARIH	KOSULKODU	ECZA_FAT_TIP
A09-0522	000000000000001	250	0	0	C	08.03.2004	0	0	0	0	500	10029	0	0	6	0	0	H	0	0	0	0	0	0	0	0	I				10029						0	0	1	1		0	250	0			08.03.2004		0
bu da codelar

Kod: Tümünü seç

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ADODB, DB, Grids, DBGrids, ExtCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    OpenDialog1: TOpenDialog;
    ADOConnection1: TADOConnection;
    ADODataSet1: TADODataSet;
    ADOTable1: TADOTable;
    ADOTable1STOK_KODU: TStringField;
    ADOTable1FISNO: TStringField;
    ADOTable1STHAR_GCMIK: TBCDField;
    ADOTable1DEPO_KODU: TSmallintField;
    ADOTable1STHAR_ACIKLAMA: TStringField;
    ADOTable1STHAR_FTIRSIP: TStringField;
    ADOTable1STHAR_CARIKOD: TStringField;
    DBGrid1: TDBGrid;
    DataSource1: TDataSource;
    Label1: TLabel;
    Label2: TLabel;
    Panel1: TPanel;
    procedure Button1Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
   book:variant;
   excel,sheet:variant;
   satir, sutun:integer;
   str:string;


implementation
uses ComObj;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
    excel := createOleObject('Excel.application');
    OpenDialog1.Filter := 'Excel Dosyaları (*.xls)|*.xls';
    if opendialog1.Execute then
    begin
        book:= Excel.WorkBooks.Open(OpenDialog1.FileName); 
        try 
            Screen.Cursor := crHourGlass; 
            sheet := book.worksheets[1]; 
            for satir:=1 to 2500 do 
            begin 
                str := sheet.cells[satir, 1]; 
                if (str <> '') then 
                begin
                    Update;
                    ADOTable1.Append;
                    for sutun:=1 to 83 do
                    if sutun = 3 Then
                    adoTable1.Fields[sutun-1].AsInteger := StrToInt(sheet.cells[satir, sutun])
                    else
                    adoTable1.Fields[sutun-1].AsString :=sheet.cells[satir, sutun];
                    adoTable1.Post;
                end; 
            end; 
            Excel.quit; 
            excel:=Unassigned; 
        finally 
            Screen.Cursor := crDefault; 
        end; 
    end; 

End; 



procedure TForm1.FormShow(Sender: TObject);
begin
       adoTable1.Open;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  adoTable1.Close;
end;

end.
bu da sql deki tabloların özellikleri bir kaçının

STOK VARCHAR 35

FIS NO VARCHAR 15

DEPO KODU SMALLINT

STHAR_ACIKLAMA VARCHAR 35

STHAR_FTIRSIP CHAR 1

STHAR_CARIKOD VARCHAR 15
toplam 83 field var bir de bana sorun çıkaran inckeyno diye otomatik oluşan bir primary key ve toplam 83 adet field dan oluşuyor sql server 2000 deki tablo.........

Şimdi exceldeki veriyi benim yaptığım şekilde çekip ki bu olaydan huso abimizden bilgi aldım baya bir yardımcı oldu bana bu excel konusunda birebir sql deki fieldlarla excel deki field lar ama ben sadece 6 veya 7 fielda bilgi girişi yapıcam....Bunu yapabilirmiyim yani exceldeki girdiğim 6 fieldlık veriyi delphiye çekip bu tabloları select yapıp nasıl sql server daki table gerekli alanlarına yazabilirim.....

Şimdiden teşekkürler
a4tech

selamünaleyküm

Mesaj gönderen a4tech »

yazmayı unuttuğum olay birebir 83 to 83 gibi bir olay yapıyor bizim yaptığmız ama ben 6 fieldtaki exceldeki tüm veriyi alıp direk 6 fielda sql deki tabloya insert etmem gerekiyor...83 to 83 yaptığım için işin içine primary key de giriyor ona yazamadığım içinde hata alıyorum....ama bu yaptığmız olayda illa database deki field kadar exceldede field oluşturmam gerekiyor...ama dediğim gibi ben sadece excel de 6 field oluşturup ona değerleri girip elle örneğin 50 satırlık bir veri onu direk sql server 200 deki tabloya insert etmem gerekiyor...yardımcı olursanız sevinirim.......
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2247
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Tekrar Selamlar,

MS-SQL Server'da tanımlı Primary Key boş ise oraya değer koymanız gerekir, eğer Primary Key aynı zamanda bir Identity Field ise oraya değer koymamanız gerekir zira MS-SQL Server oraya kendi değer atacaktır.

Bunun dışında fieldlarınızdan herhangi birinde (excel'de sizin işinize yaramayan bir field) NOT NULL Tanımlı olabilir buna da dikkat etmeniz gerekir.

83 Field'ı doldurmak yerine, Bir Insert Cümleciği oluşturabilirsiniz (İçerisinde sadece size gerekli fieldların olduğu) ve bu Insert cümlesini Execute ettirerek kayıt yapabilirsiniz.

Ayrıca SQL'deki Field type'lar belirsiz. Burada veri uyuşmazlığı ile de karşılaşabilirsiniz.

Bun noktalara dikkat edin.

Kolay Gelsin.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
a4tech

selamünaleyküm

Mesaj gönderen a4tech »

peki excel dbgrid aldığım verileri nasıl fieldları nasıl select edip sql serverdeki database yazabiliim....biraz bilgi verirmisiniz bu konuda çok fazla iyi değilim....
a4tech

buna benzer bir sey yapılabilir mi bu da hata veriyor

Mesaj gönderen a4tech »

Kod: Tümünü seç

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, DBGrids, DB, ADODB, StdCtrls, Buttons;

type
  TForm1 = class(TForm)
    SpeedButton1: TSpeedButton;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    ADOConnection1: TADOConnection;
    ADOQuery1: TADOQuery;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    Button1: TButton;
    Label1: TLabel;
    DBGrid2: TDBGrid;
    Edit1: TEdit;
    Button2: TButton;
    ADOTable1: TADOTable;
    ADOConnection2: TADOConnection;
    DataSource2: TDataSource;
    ADOQuery2: TADOQuery;
    ADOQuery2STOK_KODU: TStringField;
    ADOQuery2FISNO: TStringField;
    ADOQuery2STHAR_GCMIK: TBCDField;
    ADOQuery2STHAR_GCKOD: TStringField;
    ADOQuery2DEPO_KODU: TSmallintField;
    ADOQuery2STHAR_ACIKLAMA: TStringField;
    ADOQuery2STHAR_FTIRSIP: TStringField;
    ADOQuery2STHAR_HTUR: TStringField;
    ADOQuery2STHAR_DOVTIP: TWordField;
    ADOQuery2STHAR_BGTIP: TStringField;
    ADOQuery2STHAR_CARIKOD: TStringField;
    ADOQuery2SIRA: TSmallintField;
    ADOQuery2STRA_SIPKONT: TSmallintField;
    ADOQuery2STHAR_TESTAR: TDateTimeField;
    ADOQuery2VADE_TARIHI: TDateTimeField;
    ADOQuery2SUBE_KODU: TSmallintField;
    ADOQuery2EXPORTTYPE: TWordField;
    ADOQuery2ONAYTIPI: TStringField;
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  ExcelDosya : String;

implementation

{$R *.dfm}

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
ExcelDosya := 'c:\excelimport\Kitap1.xls';
  DataSource1.DataSet := AdoQuery1;
  DBGrid1.DataSource  := DataSource1;

  AdoConnection1.LoginPrompt := False;
  AdoConnection1.ConnectionString :=
  'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+ ExcelDosya + ';Extended properties=Excel 8.0';
  AdoQuery1.Connection := AdoConnection1;
  AdoQuery1.SQL.Clear;
  AdoQuery1.SQL.Add( 'Select * from [Sayfa1$]');
  AdoQuery1.Active := True;
  
  end;

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
AdoConnection2.LoginPrompt := False;
AdoQuery2.Connection := AdoConnection1;
AdoQuery2.SQL.Clear;
AdoQuery2.SQL.Add( 'Select STOK_KODU, FISNO, STHAR_GCMIK, STHAR_GCKOD, DEPO_KODU, STHAR_ACIKLAMA, STHAR_FTIRSIP, STHAR_HTUR, STHAR_DOVTIP, STHAR_BGTIP, STHAR_CARIKOD, SIRA, STRA_SIPKONT, STHAR_TESTAR, VADE_TARIHI, SUBE_KODU, EXPORTTYPE, ONAYTIPI from TBLSIPATRA');
AdoQuery2.Active := True;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin

end;

end.
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2247
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Selamlar,

Sanırım Admin az önce gönderdiğiniz diğer soruyu silmiş bu sebeple ihtiyacınız olan cevabı buraya yazıyorum,


Diyelim ki Excel'deki tablonuzdaki Hücreler aşağıdaki gibi olsun

H1 (String İsim İçin Kullanılsın),
H2 (String Sınav Kodu için Kullanılsın),
H3 (Numeric(10,2) Not için Kullanılsın)

Ve SQL Table'ınızdaki field'lar da aşağıdaki gibi olsun

SNV_ID (Integer, Identity, Primary Key, NotNull),
SNV_OGR_ADI (String(30))
SNV_SINAV_NO (String(10))
SNV_NOT (Numeric(10,2))

Şimdi nasıl Insert Ederim?

Bir SQL String Hazırtlarsınız ve değerleri buraya Paremetre olarak atarsınız

Yani

Kod: Tümünü seç


  AdoQuery1.SQL.Text := 'INSERT INTO SNV_TABLE (SNV_OGR_ADI, SNV_SINAV_NO, SNV_NOT)
VALUES (:STR_AD, :STR_SINAV, :FLT_NOT)' ;

  ADOQuery1.Parameters.ParamByName('STR_AD').Value := (Excel'deki Hücre1 Değeri) ;
  ADOQuery1.Parameters.ParamByName('STR_SINAV').Value := (Excel'deki Hücre2 Değeri) ;
  ADOQuery1.Parameters.ParamByName('FLT_NOT').Value := (Excel'deki Hücre3 Değeri) ;
  ADOQuery1.ExecSQL ;




Yukarıdaki kodda dikkat ettiyseniz Primary Key Identity alan INSERT Cümlesinde Geçmiyor. Zaten ihtiyaç da yok zira MS-SQL Server kendisi türeteceği için bunu insert cümlesinde göndermeye gerek yok.

Yukarıdaki kod Manuel olarak Bir Insert Cümlesinin Execute edilmesini göstermekte. Siz ona bakarak kendi cümlenizi hazırlamalısınız.

Kolay Gelsin.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
a4tech

teşekkür ederim

Mesaj gönderen a4tech »

kardeş teşekkür ederim...Allah razı olsun...Hemen bakıyorum...
a4tech

ayrıca eklemek istiyorum

Mesaj gönderen a4tech »

Senin yazdığın kodu ta en baştan istemiştim bunun normal := şeklinde yapılacak bir şekli yopmu eşitlik manasında husonete sormuştum ama bana direk ado ile bir örnek var demişti vs...bunu bekliyordum...ve gönderdin kardeş teşekkür ederim...
a4tech

peki excel hücre değerini nasıl tanımlayacam

Mesaj gönderen a4tech »

yaa kusura bakma hakkaten ben bu excelle hiç uğraşmadım...Normalde excel deki sheeti buraya çektim ama hücre değerlerini nasıl görecek...bu yani anlamadım bu hücre değeri olayını...
a4tech

yani sunu demek istedim

Mesaj gönderen a4tech »

biz exceldeki verileri normal code larını gönderdiğim metotla aldığımız zaman hücre hücre yazabilecekmiyim...? anlayamadım orasını...veya öle değilse nasıl alıcam....
a4tech

selamünaleyküm...

Mesaj gönderen a4tech »

daha yazdığınız excel hücrelerini söle yapın dediğiniz onları yazmadan bir calistiriyorum söle bir hata veriyor

string literals may have at most 255 elements......diye hata veriyor...255 karakteri geçemeyeceksek mümkün değil ki ben 254 olsun ancak öle olabilir ....peki nasıl yapacaz lüften çözüm........
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2247
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Selamlar,

Yaw o kadar karışık anlatıyorsunuz ki yazdıklarınızı anlamakta güçlük çekiyorum :)

Ama anladığım kadarı ile yapmanız gereken şu,

Kod: Tümünü seç

  AdoQuery1.Params.ParamByName('STR_KOD').Value := Sheet.Cells[satir, sutun]; 
gibi bir kod yazmanız gerekiyor. Tabi STR_KOD dediğim yerde sizin asıl INSERT cümlesindeki (:) ile başlayan parametreleriniz olacak.

Yani döngü içerisinde veremeyeceksiniz bunun yerine biraz daha sabit bir kod ile her excel satırı için (sütünlarını bilerek) parametrelere Assign etmeniz gerekecek.

Zannedersem sorduğunuz bu ama değilse bilemem :)

Kolay Gelsin.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
a4tech

tekrar selamlar

Mesaj gönderen a4tech »

o olayı hallettim kayıt olayını ama yine kayddemiyorum tipler uyuşmuyor....her türlü tipi denedim olmuyor neden acaba........uyum da şu........

Database deki field Sql Server daki yani Decimal 16 değeri var excelden aldığım veriyi bir türlü buna göre değiştiremedim..olmadı...
Cevapla