I want to fill out my students’ parental consent forms using the word automation method by pulling data from the database. In my code, I can only import one student's parental permission form into each word document. All I want is to pull data for each person one after the other on the same word document.

private void VelizinBelDok()
{
try
{
System.Threading.Thread.Sleep(100);
Cursor.Current = Cursors.WaitCursor;
Object oMissing = System.Reflection.Missing.Value;
Object oTrue = true;
Object oFalse = false;
Word.Application oWord = new Word.Application();
Word.Document oWordDoc = new Word.Document();
oWord.Visible = true;
oWord.WindowState = Word.WdWindowState.wdWindowStateMinimize;
oWord.WindowState = Word.WdWindowState.wdWindowStateMaximize;
Object oTemplatePath = System.Windows.Forms.Application.StartupPath + "\\Belgeler\\VelizinBel.docx";
using (var conn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source = gezievrak2541.accdb; Jet OLEDB:Database Password = Fatih2541; Mode = ReadWrite"))
{
conn.Open();
using (OleDbCommand cmd = new OleDbCommand("SELECT * FROM gezilistemiz25, gezibilgileri25 where unvani='Ögrenci'", conn))
using (OleDbDataReader dr = cmd.ExecuteReader())
{
while (dr.Read())
{
oWordDoc = oWord.Documents.Add(ref oTemplatePath, ref oMissing, ref oMissing, ref oMissing);
foreach (Word.Field myMergeField in oWordDoc.Fields)
{
Word.Range rngFieldCode = myMergeField.Code;
String fieldText = rngFieldCode.Text;
if (fieldText.StartsWith(" MERGEFIELD"))
{
Int32 endMerge = fieldText.IndexOf("\\");
Int32 fieldNameLength = fieldText.Length - endMerge;
String fieldName = fieldText.Substring(11, endMerge - 11);
fieldName = fieldName.Trim();
if (fieldName == "sinifi")
{
myMergeField.Select();
oWord.Selection.TypeText(dr["sinifi"].ToString());
}
if (fieldName == "ono")
{
myMergeField.Select();
oWord.Selection.TypeText(dr["ono"].ToString());
}
if (fieldName == "adi")
{
myMergeField.Select();
oWord.Selection.TypeText(dr["adi"].ToString());
}
if (fieldName == "soyadi")
{
myMergeField.Select();
oWord.Selection.TypeText(dr["soyadi"].ToString());
}
if (fieldName == "gtarihi")
{
myMergeField.Select();
oWord.Selection.TypeText(DateTime.Parse(dr["gtarihi"].ToString()).ToShortDateString());
}
if (fieldName == "dtarihi")
{
myMergeField.Select();
oWord.Selection.TypeText(DateTime.Parse(dr["gezilistemiz25.dtarihi"].ToString()).ToShortDateString());
}
if (fieldName == "gyeri")
{
myMergeField.Select();
oWord.Selection.TypeText(dr["gyeri"].ToString());
}
}
}
oWordDoc.Activate();
oWord.Activate();
}
conn.Close();
conn.Dispose();
}
oWord.ActiveDocument.SaveAs2(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Veli Izin Belgesi.docx"));
oWordDoc.Close(ref oFalse, ref oMissing, ref oMissing);
oWord.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(oWordDoc);
System.Runtime.InteropServices.Marshal.ReleaseComObject(oWord);
oWordDoc = null;
oWord = null;
GC.WaitForPendingFinalizers();
GC.Collect();
Cursor.Current = Cursors.Default;
MessageBox.Show("Veli Izin Belgesi Word formatinda masaüstüne kaydedildi!");
}
}
catch (Exception hata)
{
MessageBox.Show("Islem Sirasinda Hata Olustu." + hata.Message);
}
}
Mehmet FatihPosted Oct 13, 2023, 8:13 PM
I am soryy Prasad but it gives an empty page. When I add this line while (dr.Read()) { oWordDoc = oWord.Documents.Add(ref oTemplatePath, ref oMissing, ref oMissing, ref oMissing); it gives all the students but in different documents.
Prasad RaveendranPosted Oct 12, 2023, 1:26 AM
It appears that your code is currently creating a new Word document for each student and filling in their information separately. To achieve your goal of pulling data for each person one after the other in the same Word document, you need to modify your code to create the Word document outside of the loop and then add the data for each student in the same document. Here's a modified version of your code to do that: